说有13个球,其中有一个球和其它的质量不一样(没有说此球比别的球轻或重);
现要求用天枰只秤3次就把此球找出.
知道的请写出算法:
1。编号1-13。分3组:1-4,5-8,9-13。
2。测试1+2+3+4与5+6+7+8。不失一般,设1+2+3+4小于或等于5+6+7+8。
3。如果“小于”则:9-13均为好。1-4有偏轻嫌疑。5-8有偏重嫌疑。
测试二:1+2+5与3+4+6。若等于,则:7-8中有坏……(以下略)
若大于,则:5有偏重嫌疑、3-4有偏轻嫌疑(以下略) 若小于,则:6有偏重嫌疑、1-2有偏轻嫌疑(以下略)。4。如果“等于”则:1-8均为好。9-13有嫌疑。
测试二:9+10与11+任一好。若等于,则:12-13中有坏……(以下略)
若大于,则:9-10有偏重嫌疑,11有偏轻嫌疑(以下略) 若小于,则:9-10有偏轻嫌疑、11有偏重嫌疑(以下略)
处已经称了两次!若“3-4有偏轻嫌疑”,但是势必要先看5是否有偏重嫌疑,但这就已经有三次了!
12只蛋称量3次找出其中惟一的坏蛋
【题】12只鸡蛋中有1个是坏的,好蛋的重量都是一样的,坏蛋重量起了变化(变轻变重都有可能)。只准用天平称量3次就要确定哪只是坏蛋,并指明是变轻还是变重了。
【解】将这12只蛋命名为0,1,2,3,4,5,6,7,8,9,10,11。
第1次称量:比较0,1,2,3与4,5,6,7。
①如果0,1,2,3=4,5,6,7那么坏蛋必然在8~11中。于是
第2次称量:比较8,9与10,0(0是好蛋,11暂不参与称量)。
如果8,9=10,0那么坏蛋必为11。于是
第3次称量:比较11与0(好蛋)。
若11>0表明坏蛋偏重;否则表明坏蛋偏轻。
如果8,9>10,0那么坏蛋必然在8~10中。于是
第3次称量:比较8与9。
若8=9表明坏蛋为10偏轻;
若8>9表明坏蛋为8偏重;
若8<9表明坏蛋为9偏重。
如果8,9<10,0那么坏蛋仍然在8~10中。于是
第3次称量:比较8与9。
若8=9表明坏蛋为10偏重;
若8>9表明坏蛋为9偏轻;
若8<9表明坏蛋为8偏轻。
②如果0,1,2,3>4,5,6,7那么坏蛋必然在0~7中。若坏蛋在4~7中则蛋坏变轻;若坏蛋在0~3中则蛋坏变重。
第2次称量:比较0,1,4与2,3,5(6,7暂不参与称量)。
如果0,1,4=2,3,5那么坏蛋不是6就是7。于是
第3次称量:比较6与7。偏轻者为坏蛋。
如果0,1,4>2,3,5那么坏蛋必然在0,1,5中。于是
第3次称量:比较0与1。
若0=1表明坏蛋为5偏轻;
若0>1表明坏蛋为0偏重;
若0<1表明坏蛋为1偏重。
如果0,1,4<2,3,5那么坏蛋必然在2,3,4中。于是
第3次称量:比较2与3。
若2=3表明坏蛋为4偏轻;
若2>3表明坏蛋为2偏重;
若2<3表明坏蛋为3偏重。
③如果0,1,2,3<4,5,6,7那么坏蛋必然在0~7中。若坏蛋在4~7中则蛋坏变重;若坏蛋在0~3中则蛋坏变轻。
第2次称量:比较0,1,4与2,3,5(6,7暂不参与称量)。
如果0,1,4=2,3,5那么坏蛋不是6就是7。于是
第3次称量:比较6与7。偏重者为坏蛋。
如果0,1,4<2,3,5那么坏蛋必然在0,1,5中。于是
第3次称量:比较0与1。
若0=1表明坏蛋为5偏重;
若0<1表明坏蛋为0偏轻;
若0>1表明坏蛋为1偏轻。
如果0,1,4>2,3,5那么坏蛋必然在2,3,4中。于是
第3次称量:比较2与3。
若2=3表明坏蛋为4偏重;
若2<3表明坏蛋为2偏轻;
若2>3表明坏蛋为3偏轻。
/* 12eggs.c */
#include<stdio.h>
#include<math.h>
main()
{ float egg[12]={1,1,1,1, 1,1,1,1, 1,1,1,1};
int i; float dif;
printf("input a number between -12 to 12: ");
scanf("%d",&i); if(i==0)i=1; egg[abs(i)-1]=i>0?1.1:0.9;
dif=(egg[0]+egg[1]+egg[2]+egg[3])-(egg[4]+egg[5]+egg[6]+egg[7]);
if( dif==0) /*坏蛋在egg[8~11]*/
{ float dif=egg[8]+egg[9]-egg[10]-egg[0];
if(dif==0) /*坏蛋为egg[11]*/
if(egg[11]>egg[0])printf("No.12: heavy\n");
else printf("No.12: light\n");
else if(dif>0) /*坏蛋在egg[8~10]*/
if(egg[8]==egg[9])printf("No.11: light\n");
else if(egg[8]>egg[9]) printf("No.9: heavy\n");
else printf("No.10: heavy\n");
else /*坏蛋在egg[8~10]*/
if(egg[8]==egg[9])printf("No.11: heavy\n");
else if(egg[8]>egg[9]) printf("No.10: light\n");
else printf("No.9: light\n");
}
else if(dif>0) /*坏蛋在egg[0~7]*/
{ float dif=(egg[0]+egg[1]+egg[4])-(egg[2]+egg[3]+egg[5]);
if(dif==0) /*坏蛋在egg[6,7]*/
if(egg[6]<egg[7])printf("No.7: light\n");
else printf("No.8: light\n");
else if(dif>0) /*坏蛋在egg[0,1,5]*/
if(egg[0]==egg[1])printf("No.6: light\n");
else if(egg[0]>egg[1]) printf("No.1: heavy\n");
else printf("No.2: heavy\n");
else /*坏蛋在egg[2,3,4]*/
if(egg[2]==egg[3])printf("No.5: light\n");
else if(egg[2]>egg[3]) printf("No.3: heavy\n");
else printf("No.4: heavy\n");
}
else /*坏蛋在egg[0~7]*/
{ float dif=(egg[0]+egg[1]+egg[4])-(egg[2]+egg[3]+egg[5]);
if(dif==0) /*坏蛋在egg[6,7]*/
if(egg[6]>egg[7])printf("No.7: heavy\n");
else printf("No.8: heavy\n");
else if(dif<0) /*坏蛋在egg[0,1,5]*/
if(egg[0]==egg[1])printf("No.6: heavy\n");
else if(egg[0]<egg[1]) printf("No.1: light\n");
else printf("No.2: light\n");
else /*坏蛋在egg[2,3,4]*/
if(egg[2]==egg[3])printf("No.5: heavy\n");
else if(egg[2]<egg[3]) printf("No.3: light\n");
else printf("No.4: light\n");
}
}
以上程序的缺点是处理dif<0(最外围的else)花费了与处理dif>0等长的代码,造成大面积的准雷同现象。下面分别是完整的和简化的改进版本(使用结构体数组)。
/* 12.c完整版 */
#include<stdio.h>
#include<math.h>
struct Egg {
float weight;
int number;
char quality; /* 'U'=unknown 'G'=good 'H'=heavy 'L'=light */
} egg[12]={ 1,1,'U', 1,2,'U', 1,3,'U', 1,4,'U', 1,5,'U', 1,6,'U',
1,7,'U', 1,8,'U', 1,9,'U', 1,10,'U', 1,11,'U', 1,12,'U'};
main()
{ int i; float dif=0, dif2;
printf("input a number between -12 to 12: ");
scanf("%d",&i); if(i==0)i=1;
egg[abs(i)-1].weight=i>0?1.1:0.9;
for(i=0;i<4;i++)dif+=egg[i].weight;
for(i=4;i<8;i++)dif-=egg[i].weight;
if(dif == 0)
{ for(i=0;i<8;i++)egg[i].quality='G';
dif2=egg[8].weight+egg[9].weight-egg[10].weight-egg[0].weight;
if(dif2 == 0)
{ for(i=8;i<=10;i++)egg[i].quality='G';
if(egg[11].weight > egg[0].weight)egg[11].quality='H';
else egg[11].quality='L';
}
else if(dif2 > 0)
{ egg[11].quality='G';
if(egg[8].weight==egg[9].weight)
{ egg[8].quality=egg[9].quality='G';
egg[10].quality='L'; }
else
{ egg[10].quality='G';
egg[8].quality=egg[9].quality='G';;;;;;;;;;;;;;;;;/*mask*/
if(egg[8].weight>egg[9].weight)egg[8].quality='H';
else egg[9].quality='H';
}
}
else
{ egg[11].quality='G';
if(egg[8].weight==egg[9].weight)
{ egg[8].quality=egg[9].quality='G';
egg[10].quality='H'; }
else
{ egg[10].quality='G';
egg[8].quality=egg[9].quality='G';;;;;;;;;;;;;;;;;/*mask*/
if(egg[8].weight<egg[9].weight)egg[8].quality='L';
else egg[9].quality='L';
}
}
}
else
{ for(i=8;i<12;i++)egg[i].quality='G';
if(dif > 0)
fenxi( &egg[0],&egg[4] );
else
fenxi( &egg[4],&egg[0] );
}
for(i=0;i<12;i++)
printf("egg%2d: %c\n",egg[i].number,egg[i].quality);
}
fenxi(struct Egg a[4] , struct Egg b[4])
{ int i; float dif2=0;
dif2+=a[0].weight+a[1].weight+b[0].weight;
dif2-=a[2].weight+a[3].weight+b[1].weight;
if(dif2 == 0)
{ for(i=0;i<4;i++)a[i].quality='G';
for(i=0;i<2;i++)b[i].quality='G';
b[2].quality=b[3].quality='G';;;;;;;;;;;;;;;/*mask*/
if(b[2].weight<b[3].weight)b[2].quality='L';
else b[3].quality='L';
}
else if(dif2 > 0)
{ a[2].quality=a[3].quality='G';
b[2].quality=b[3].quality=b[0].quality='G';
a[0].quality=a[1].quality=b[1].quality='G';;;;;;;;/*mask*/
if(a[0].weight==a[1].weight)b[1].quality='L';
else if(a[0].weight>a[1].weight) a[0].quality='H';
else a[1].quality='H';
}
else
{ for(i=0;i<4;i++)a[i].quality=b[i].quality='G';;;;;/*mask*/
if(a[2].weight==a[3].weight) b[0].quality='L';
else if(a[2].weight>a[3].weight) a[2].quality='H';
else a[3].quality='H';
}
}
/* 12-1.c简化版 */
#include<stdio.h>
#include<math.h>
struct Egg {
float weight; int number;
char quality; /* 'G'=good 'H'=heavy 'L'=light */
} egg[12]={ 1,1,'G', 1,2,'G', 1,3,'G', 1,4,'G', 1,5,'G', 1,6,'G',
1,7,'G', 1,8,'G', 1,9,'G', 1,10,'G', 1,11,'G', 1,12,'G'};
fenxi(struct Egg a[4] , struct Egg b[4])
{ int i; float dif2=0;
dif2+=a[0].weight+a[1].weight+b[0].weight;
dif2-=a[2].weight+a[3].weight+b[1].weight;
if(dif2 == 0)
if(b[2].weight<b[3].weight) b[2].quality='L';
else b[3].quality='L';
else if(dif2 > 0)
if(a[0].weight==a[1].weight) b[1].quality='L';
else if(a[0].weight>a[1].weight) a[0].quality='H';
else a[1].quality='H';
else
if(a[2].weight==a[3].weight) b[0].quality='L';
else if(a[2].weight>a[3].weight) a[2].quality='H';
else a[3].quality='H';
}
main()
{ int i; float dif=0, dif2;
printf("input a number between -12 to 12: ");
scanf("%d",&i); if(i==0)i=1;
egg[abs(i)-1].weight=i>0?1.1:0.9;
for(i=0;i<4;i++)dif+=egg[i].weight;
for(i=4;i<8;i++)dif-=egg[i].weight;
if(dif == 0)
{ dif2=egg[8].weight+egg[9].weight-egg[10].weight-egg[0].weight;
if(dif2 == 0)
if(egg[11].weight > egg[0].weight) egg[11].quality='H';
else egg[11].quality='L';
else if(dif2 > 0)
if(egg[8].weight==egg[9].weight) egg[10].quality='L';
else if(egg[8].weight>egg[9].weight)egg[8].quality='H';
else egg[9].quality='H';
else
if(egg[8].weight==egg[9].weight) egg[10].quality='H';
else if(egg[8].weight<egg[9].weight)egg[8].quality='L';
else egg[9].quality='L';
}
else if(dif > 0) fenxi( &egg[0],&egg[4] );
else fenxi( &egg[4],&egg[0] );
for(i=0;i<12;i++)
if(egg[i].quality=='H')
printf("egg %02d: heavy\n",egg[i].number);
else if(egg[i].quality=='L')
printf("egg %02d: light\n",egg[i].number);
}