C趣味程序百例(24)可称1~40磅的4块砝码
74.四个可以重1-40磅的砝码
法国数学家梅·迪亚克(May Dziak)在他的《数字游戏》(1962)中提出了一个问题:一个商人有一个重40磅的砝码,有一天不小心把它掰成了四块。后来,商人说每块的重量是整磅,发现这四块在天平上的重量可以从1磅到40磅不等。请问这四件有多重?
*问题分析与算法设计
本题目是上一个的发展。题目中给出的条件是“放在天平上”,意思是同样的重量可以放在天平的左边也可以放在右边。如果规定砝码只能放在天平的左侧,那么就会有:
砝码的重量+左侧砝码之和=右侧砝码之和
。由此可知:
砝码的重量=右侧砝码的重量之和-左侧砝码的重量之和
编程时,只需做出“右侧砝码的重量之和-左侧砝码的重量之和”编程中需要注意的是:如何用简单的方法表示一个砝码是在天平的左侧还是右侧,或者根本不用。
以下程序用1、-1和0来表示以上三种情况,请注意理解。
*程序和程序注释
# include
# include
void main()
{
int weight 1,weight 2,weight 3,weight 4,D1,D2,D3,D4,X. /*flag:满足问题含义的标记*/
printf("权重分解为以下4块:");
for(weight 1 = 1;weight 1 for(weight 2 = weight 1+1;weight 2 for(weight 3 = weight 2+1;weight 3 if((weight 4 = 40-weight 1-weight 2-weight 3)> = weight 3)
{
for(flag = 1,x = 1;x for(flag=0,D1 = 1;D1 >-2;D1-)/*把砝码放在天平的左边*/
for(D2 = 1;d2>-2&&!旗帜;D2-)/* 1:重量在天平的右边*/
for(D3 = 1;d3>-2&&!旗帜;D3-)/* 0:不使用此权重*/
for(D4 = 1;d4>-2&&!旗帜;D4-)/*-1:权重在天平的左边*/
if(x = = weight 1 * D1+weight 2 * D2+weight 3 * D3+weight 4 * D4)
flag = 1;
if(flag)printf(" % d % d % d % d \ n ",weight1,weight2,weight3,weight 4);
flag = 0;
}
}
*运行结果
重量被分成以下4块:1 3 9 27
0条评论