您的位置:首页 > 其它

程序设计实践与提高2 - 学习记录

2013-12-19 19:56 465 查看


















【代码】
/* 例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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: