程序设计实践与提高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

你可能感兴趣的:(程序设计)