74.可稱1~40磅的4塊砝碼
法國數(shù)學(xué)家梅齊亞克在他的《數(shù)字組合游戲》(1962)中提出了一個問題:一位商人有一個重40磅的砝碼,一天不小心將砝碼摔成了四塊。后來商人稱得每塊的重量都是整磅數(shù),而且發(fā)現(xiàn)這四塊碎片可以在天平上稱1至40磅之間的任意重量。請問這四塊碎片各重多少?
*問題分析與算法設(shè)計
本題是上一題的發(fā)展。題目中給出的條件是“在天平上”,這意味著:同一砝碼既可以放在天平的左側(cè),也可以放在天平的右側(cè)。若規(guī)定重物只能放在天平的左側(cè),則當(dāng)天平平衡時有:
重物重量+左側(cè)砝碼重量總和=右側(cè)砝碼重量總和
由此可得:
重物重量=右側(cè)砝碼重量總和-左側(cè)砝碼重量總和
編程時只要根據(jù)以上公式,使“右側(cè)砝碼重量總和-左側(cè)砝碼重量總和”可以表示1到40之間的全部重量即可。編程中要注意的是:怎樣采用一種簡單的方法來表示一個砝碼是在天平的左側(cè)還是在天平的右側(cè),或是根本沒有使用。
以下程序采用1、 -1和0分別表示上述三種情況,請注意理解。
*程序與程序注釋
#include
#include
void main()
{
int weight1,weight2,weight3,weight4,d1,d2,d3,d4,x,flag; /*flag:滿足題意的標(biāo)記*/
printf("The weight is broke up as following 4 pieces:");
for(weight1=1;weight1<=40;weight1++) /*將40分解成4份*/
for(weight2=weight1+1;weight2<=40-weight1;weight2++)
for(weight3=weight2+1;weight3<=40-weight1-weight2;weight3++)
if((weight4=40-weight1-weight2-weight3)>=weight3)
{
for(flag=1,x=1;x<41&&flag;x++) /*判斷可否稱出1~40之間的全部重量*/
for(flag=0,d1=1;d1>-2;d1--) /*將重物放在天平的左邊*/
for(d2=1;d2>-2&&!flag;d2--) /*1:砝碼在天平右邊*/
for(d3=1;d3>-2&&!flag;d3--) /*0:不用該砝碼*/
for(d4=1;d4>-2&&!flag;d4--) /*-1:砝碼在天平的左邊*/
if(x==weight1*d1+weight2*d2+weight3*d3+weight4*d4)
flag=1;
if(flag) printf("%d %d %d %d\n",weight1,weight2,weight3,weight4);
flag=0;
}
}
*運行結(jié)果
The weight is broke up as following 4 pieces: 1 3 9 27
法國數(shù)學(xué)家梅齊亞克在他的《數(shù)字組合游戲》(1962)中提出了一個問題:一位商人有一個重40磅的砝碼,一天不小心將砝碼摔成了四塊。后來商人稱得每塊的重量都是整磅數(shù),而且發(fā)現(xiàn)這四塊碎片可以在天平上稱1至40磅之間的任意重量。請問這四塊碎片各重多少?
*問題分析與算法設(shè)計
本題是上一題的發(fā)展。題目中給出的條件是“在天平上”,這意味著:同一砝碼既可以放在天平的左側(cè),也可以放在天平的右側(cè)。若規(guī)定重物只能放在天平的左側(cè),則當(dāng)天平平衡時有:
重物重量+左側(cè)砝碼重量總和=右側(cè)砝碼重量總和
由此可得:
重物重量=右側(cè)砝碼重量總和-左側(cè)砝碼重量總和
編程時只要根據(jù)以上公式,使“右側(cè)砝碼重量總和-左側(cè)砝碼重量總和”可以表示1到40之間的全部重量即可。編程中要注意的是:怎樣采用一種簡單的方法來表示一個砝碼是在天平的左側(cè)還是在天平的右側(cè),或是根本沒有使用。
以下程序采用1、 -1和0分別表示上述三種情況,請注意理解。
*程序與程序注釋
#include
#include
void main()
{
int weight1,weight2,weight3,weight4,d1,d2,d3,d4,x,flag; /*flag:滿足題意的標(biāo)記*/
printf("The weight is broke up as following 4 pieces:");
for(weight1=1;weight1<=40;weight1++) /*將40分解成4份*/
for(weight2=weight1+1;weight2<=40-weight1;weight2++)
for(weight3=weight2+1;weight3<=40-weight1-weight2;weight3++)
if((weight4=40-weight1-weight2-weight3)>=weight3)
{
for(flag=1,x=1;x<41&&flag;x++) /*判斷可否稱出1~40之間的全部重量*/
for(flag=0,d1=1;d1>-2;d1--) /*將重物放在天平的左邊*/
for(d2=1;d2>-2&&!flag;d2--) /*1:砝碼在天平右邊*/
for(d3=1;d3>-2&&!flag;d3--) /*0:不用該砝碼*/
for(d4=1;d4>-2&&!flag;d4--) /*-1:砝碼在天平的左邊*/
if(x==weight1*d1+weight2*d2+weight3*d3+weight4*d4)
flag=1;
if(flag) printf("%d %d %d %d\n",weight1,weight2,weight3,weight4);
flag=0;
}
}
*運行結(jié)果
The weight is broke up as following 4 pieces: 1 3 9 27