内容 | 模糊数字、真假银币 | |||||||
一、目的: 理解并掌握枚举算法的基本思想和设计步骤。 | ||||||||
二、内容 1模糊数字 问题描述:一张单据上有一个5位数的编码,因为保管不善,其百位数已经变得模糊不清。但是知道这个5位数是57和67的倍数。现在要设计一个算法,输出所有满足这些条件的5位数,并统计这样的数的个数。 输入:每一行对应一个测试样例,每一行包含4个数字,依次是万位数、千位数、十位数和个位数。最后一行包含四个-1,表示输入结束。 输出:每组测试样例的结果输出占一行,第一个数字表示满足条件的编码个数,后面按升序输出所有满足条件的编码,数字与数字之间用空格隔开。 2 真假银币 问题描述:张三有12枚银币,其中有11枚真币和1枚假币。假币看起来和真币完全一样,但是它们的重量不一样。很遗憾的是,张三不知道假币比真币轻还是重。但他办公室有一架天平,还有一个聪明的助手。经过精心安排每次的称重,助手保证在称3次后确定发现假币。助手想跟张三开一个玩笑,只告诉他每次称重的方案和天平的状态,但是不告诉他哪个是假币,假币比真币轻还是重。请设计一个算法帮助张三辨别真假银币。 输入:第一行包含一个正整数,表示测试数据的组数。每组测试数据有三行,每行表示一次称重的结果。张三和助手事先把银币标号为A~L。每次称重的结果用3个以空格隔开的字符串表示:天平左边放置的银币标号,天平右边放置的银币标号,以及平衡状态。其中平衡状态分别用up、down和even表示,分别表示右端高、右端低和平衡。另外,每次称重天平左右的银币数总是相等的。 输出:每组测试数据的输出占一行,输出假银币的标号,并指明它比真银币轻还是重,轻则输出light,重则输出heavy。 程序代码: 1. #include<stdio.h> int main() {int a1,a2,a4,a5,bai,i,pan_duan,zhi=0,ge_shu=0,x=57,y=67; int z,sum; int a[10];//因为分别存储十个数0,1,2,3,4,5,6,7,8,9 printf("请依次输入万位,千位,十位,和个位并且输入-1-1-1-1表示停止"); scanf("%d%d%d%d",&a5,&a4,&a2,&a1); while(a5!=-1) { ge_shu=0; for(bai=0;bai<10;bai++) { zhi=a5*10000+a4*1000+bai*100+a2*10+a1*1; if((zhi%57==0)&&(zhi%67)==0) { a[ge_shu]=zhi; ge_shu++; } } printf("%d",ge_shu);printf(" "); for(i=0;i<ge_shu;i++) {printf("%d",a[i]);} printf("\r\n"); scanf("%d %d %d %d",&a5,&a4,&a2,&a1); } printf("所有满足57和67倍数条件的五位数有:\n "); z=x*y; //最小公倍数 sum=z; for(;sum<10000;) { if (sum<10000){sum=z+sum;} } for (;sum<100000; sum+=z) { printf("%d\n", sum); } printf("停止 "); return 0; } 2. #include<stdio.h> #include<iostream> #include<cstring> using namespace std; char Left[3][7]; char Right[3][7]; char result[3][7]; bool jie_guo(char c,bool light); //light为真表示假设假币为轻 int main() { int t; cin>>t; while(t--) { for(int i=0;i<3;++i) cin>>Left[i]>>Right[i]>>result[i]; for(char c='A';c<='L';c++) { if(jie_guo(c,true)){ cout<<c<<"是假币并且比真币 light.\n"; break; } else if(jie_guo(c,false)){ cout<<c<<"是假币并且比真币 heavy.\n"; break; } } } return 0; } bool jie_guo(char c,bool light){ for(int i=0;i<3;i++){ //当假设假币轻时,若假币在右边则右边up,在左边则右边down char *pleft,*pright; //当假设假币重时,若假币在右边则右边down,在左边则右边up if(light){ pleft=Left[i]; pright=Right[i]; } else{ pleft=Right[i];//当假设假币重时,用指针调换天平的两侧,使得若假币在右边则右边up pright=Left[i]; } switch(result[i][0]){ //天平右边的情况 case 'u': //右边轻 if(strchr(pright,c)==NULL) return false; break; case 'e': if(strchr(pleft,c)||strchr(pright,c)) return false; break; case 'd': //右边重 if(strchr(pleft,c)==NULL) return false; break; } } return true; } 程序测试及运行结果: 1. 2. |