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

  • 相关阅读:
    HUNAN 11562 The Triangle Division of the Convex Polygon(大卡特兰数)
    HUNAN 11560 Yangyang loves AC(二分+贪心)
    CSU 1425 Prime Summation
    CSU 1424 Qz’s Maximum All One Square
    一个奇怪的语法问题
    CSU 1416 Practical Number
    CSU 1412 Line and Circles
    Android第一篇
    强大到无与伦比的Graphviz
    CSU 1355 地雷清除计划
  • 原文地址:https://www.cnblogs.com/yym2013/p/3341635.html
Copyright © 2020-2023  润新知