毒酒几何
1000瓶酒中恐1瓶有毒,饮毒者10分钟内必亡(与多少无关),现考虑用尽量少的小白鼠试毒。方案A:酒分两大份,取一份让鼠1均饮之,知一份中有毒,再分成两大份,取一份让鼠2均饮之,知一份中有毒,……如此,1000瓶酒,10只鼠足矣。然100分钟太久,升级为方案B:酒分两大份,取一份让鼠1均饮之,两份再分成四份,各取两份让鼠2均饮之,四份再分成八份,各取四份让鼠3均饮之,……如此,1000瓶酒,10只鼠10+分钟可行。最终形成易操作性执行方案C:鼠1隔一瓶饮一,鼠2隔两瓶饮二,鼠3隔四瓶饮四瓶,鼠4隔八瓶饮八瓶,……(形似二进制编码中1表示喝,0表示不喝)。 编程根据给出的饮后死的老鼠的编号,计算出有毒的酒是哪一瓶(酒的编号为1,2,3……,老鼠的编号也是1,2,3,……)。
输入格式:
一个字符串:用逗号分隔的正整数序列(有效范围内的死鼠编号)。无序,有可能有重复。若为空串表示无一鼠死亡(酒均无毒)。
输出格式:
一个整数:毒酒的编号(第几瓶酒有毒,若均无毒输出0)。
输入样例:
3,7,9,1,5,3,2
输出样例:
343
解题思路:
直接采用位标记的方法解题。定义一个用于位标记的变量(看成是二进制数),读取字符串中的每一个数,并将对应的数位标记为1,如此操作,最后该变量的十进制的结果即为所求。
#include<stdio.h>
#include<string.h>
char str[1000];
int k=0; //用于位标记的变量
int main(){
char* p;
int num;
gets(str);
p=strtok(str,","); //字符串分割
if(p==NULL){
printf("%d",k);
return 0;
}
else{
sscanf(p,"%d",&num); //类型转换
k=k|(1<<(num-1)); //设该位为1
while(p=strtok(NULL,",")){
sscanf(p,"%d",&num);
k=k|(1<<(num-1)); //设该位为1
}
printf("%d",k); //输出结果
return 0;
}
}