小鼠试毒:
一千个瓶子里有一瓶毒药,十只小鼠(小鼠个数至少满足瓶子总数二进制位数时)
将每个瓶子的序号转换成二进制,二进制位数依次与小鼠序号相对应,当二进制某一位为1时,喂给位数对应序号的小鼠,最后将死去小鼠的序号位数与二进制对应,死去为1活着为0,得一二进制数,转换为十进制即为有毒瓶子序号。
具体代码:
//小鼠试读,10只小鼠,一瓶毒药,小鼠一旦中毒即死,如何判断出1000瓶中哪一瓶有毒 #include<stdio.h> #include<math.h> #include<stdlib.h> #include<time.h> //#define M 99 long decToBin(int M) { long c=0; int i; for(i=0;M!=0;i++) { int a=0; a= pow(10,i) ; c=a*(M%2)+c; M=M/2; } return c; } void feedmouse(char *mouse[10],int M) { int i=0;long a,c; for(i=0;i<=1000;i++) { a=decToBin(i) ; c=decToBin(M) ; int b; if(a==c) { for(b=0;b<=9;b++) { if(a%10==1) { mouse[b]="death\0"; //字符串赋值时,自己输入"\0",scanf输入时可不用添加; //输出“%c”单个输出,“%s”连续输出; } a=a/10; } } } } int find(char *mouse[10]) { int i; int a; for(i=0;i<10;i++) { if(mouse[i]=="death\0") { printf("第%d只小鼠中毒\n",i+1); //测试得中毒小鼠序号与毒药序号的二进制位数一致 a=a+pow(2,i); } } printf("第%d瓶是毒药\n",a); } int main() { char *mouse[10]; long s; int M; //M=rand();随机数固定为41 srand(time(0)) ;//取随机数 M=rand()%1001;//随机数范围(0-1000) /*范围方法 M=rand()%(a+1); (0~a) M=a+rand()%(b-a+1); (a~b) */ s=decToBin(M); printf("%ld\n",s); feedmouse(mouse,M); find(mouse); return 0; }
细节:
#include<stdlib.h> #include<time.h> int M; //M=rand();随机数固定为41 srand(time(0)) ;//取随机数 M=rand()%1001;//随机数范围(0-1000) /*范围方法 M=rand()%(a+1); (0~a) M=a+rand()%(b-a+1); (a~b) */
此部分算法为计算机自取随机数,随机数函数及范围
定义字符串:
char *mouse[10];
字符串赋值:
mouse[b]="death\0";
//字符串赋值时,自己输入"\0",scanf输入时可不用添加;
//输出“%c”单个输出,“%s”连续输出,无"\0";
输出:
printf("第%d只小鼠中毒\n",i+1);
幂指数函数:
#include<math.h>
int a=0;
a= pow(10,i) ;