程序设计实践与提高2 - 学习记录
【代码】 /* 例2.1 狱警发现一囚室的窗户栅栏被剪断了。该囚室有四个囚犯。 A说:不是我 B说:是C C说:是D D说:C胡说 已知三个人说真话,一个人说假话。请找出说谎的人。 先依次枚举假定某个人为说谎者,假定这个人说谎后,判断这种情况下4个人是否符合3个人说真话,1个人说假话。 如果符合条件,说明确定了说谎者,输出。 如果不符合条件,说明该说谎者的情况下不对,继续枚举。 */ #include <iostream> using namespace std; int main() { char lier='A'; for(;lier<='D';++lier){ //循环说谎者 //必须满足有3个说真话,1个说假话 int num=0; //说真话的人数 //已经假定一个人为说谎者了,枚举判断每个人说过的话的真值,统计说真话的和说假话的人数 if(lier!='A') ++num; if(lier=='C') ++num; if(lier=='D') ++num; if(lier!='D') ++num; //判断说真话的是不是3人,说假话的是不是1人 //如果符合,输出lier,跳出循环;如果不符合,继续循环 if(num==3) cout<<"Lier: "<<lier<<endl; } return 0; } 【输出结果】 Lier: C
【代码1】 /* 例2.1 有6个嫌疑人涉及一桩案件,现分析如下: (1)A,B至少有一人作案; //A||B (2)A,D不可能是同案犯; //!(A&&D) (3)A,E,F 3人中至少有2人作案; //A&&E || E&&F || A&&F (4)B,C 或同时作案,或与本案无关: //B&&C || !B&&!C 或者 B&&C (5)C,D中有且仅有1人作案; //(C||D) && !(C&&D) 或者 C&&!D ||!C&&D (6)如果 D 没有参与作案,则 E 也不可能参与作案。D || !D && !E 或者 D || !E 试编一程序,找出作案人。 */ #include <iostream> using namespace std; int main() { for(int A=0; A<=1; A++) for(int B=0; B<=1; B++) for(int C=0; C<=1; C++) for(int D=0; D<=1; D++) for(int E=0; E<=1; E++) for(int F=0; F<=1; F++){ if( (A||B) && (!(A&&D)) && (A&&E || E&&F || A&&F) && (B&&C) && (C&&!D ||!C&&D) && (D || !E) ){ if(A==1) cout<<"A"<<' '; if(B==1) cout<<"B"<<' '; if(C==1) cout<<"C"<<' '; if(D==1) cout<<"D"<<' '; if(E==1) cout<<"E"<<' '; if(F==1) cout<<"F"<<' '; if(!(A||B||C||D||E||F)) cout<<"null"<<' '; goto label; } } label: return 0; } 【输出结果】 A C E F 【代码2】 /* 例2.1_优化 改进程序不使用6重循环 有6个嫌疑人涉及一桩案件,现分析如下: (1)A,B至少有一人作案; //A||B (2)A,D不可能是同案犯; //!(A&&D) (3)A,E,F 3人中至少有2人作案; //A&&E || E&&F || A&&F (4)B,C 或同时作案,或与本案无关: //B&&C || !B&&!C 或者 B&&C (5)C,D中有且仅有1人作案; //(C||D) && !(C&&D) 或者 C&&!D ||!C&&D (6)如果 D 没有参与作案,则 E 也不可能参与作案。D || !D && !E 或者 D || !E 试编一程序,找出作案人。 */ #include <iostream> using namespace std; int main() { int A=1,B=1,C=1,D=1,E=1,F=1; for(int n=0;n<64;++n){ if(n%1==0) F=(F+1)%2; if(n%2==0) E=(E+1)%2; if(n%4==0) D=(D+1)%2; if(n%8==0) C=(C+1)%2; if(n%16==0) B=(B+1)%2; if(n%32==0) A=(A+1)%2; if( (A||B) && (!(A&&D)) && (A&&E || E&&F || A&&F) && (B&&C) && (C&&!D ||!C&&D) && (D || !E) ){ if(A==1) cout<<"A"<<' '; if(B==1) cout<<"B"<<' '; if(C==1) cout<<"C"<<' '; if(D==1) cout<<"D"<<' '; if(E==1) cout<<"E"<<' '; if(F==1) cout<<"F"<<' '; if(!(A||B||C||D||E||F)) cout<<"null"<<' '; break; } } return 0; } 【输出结果】 A C E F
【代码】 /*【任务2.3】适用筛法求100以内的素数。 问题: 你会用什么方法求素数? 用到循环了吗?循环的次数? 用到数组了吗?数组里存的是什么? 什么是筛法?筛的什么?筛是什么? */ #include <iostream> using namespace std; int main() { int a[100]={0}; for(int i=2;i<100;i++){ int j; //把所有能被i整除的数筛去 for(j=i+1;j<100;j++){ if(a[j]==1) continue; if(j%i==0) a[j]=1; } //找寻下一个数,如果下一个数超过了99,则退出大循环 for(j=i+1;j<100;j++){ if(a[j]==0){ i=j; break; } } if(j>=100) break; --i; } //输出筛法求出的所有素数 for(int i=2;i<100;i++){ if(a[i]==0) cout<<i<<' '; } return 0; } 【输出结果】 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Freecode : www.cnblogs.com/yym2013