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

幻灯片1 幻灯片2 幻灯片3 幻灯片4 幻灯片5 幻灯片6 幻灯片7 幻灯片8

【代码】
/* 例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

幻灯片9 幻灯片10 幻灯片11 幻灯片12 幻灯片13 幻灯片14 幻灯片15 幻灯片16 幻灯片17 幻灯片18 幻灯片19

【代码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 

幻灯片20 幻灯片21 幻灯片22 幻灯片23

【代码】
/*【任务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

幻灯片24

 

Freecode : www.cnblogs.com/yym2013

posted @ 2013-09-26 21:51  Freecode#  阅读(257)  评论(0编辑  收藏  举报