• 算法竞赛入门 —— 循环结构 习题


    习题2-1 水仙花数

    输出100~999中的所有水仙花数。若3位数ABC满足ABC=A^3+B^3+C^3,则称其为水仙花 数。例如153=1^3+5^3+3^3,所以153是水仙花数。

    #include<stdio.h>
    int main(){
        for(int i = 1;i<=9;i++){
            for(int j = 0 ;j <=9;j++){
                    for(int k = 0;k <= 9;k++){
                        int r = i * 100 + j * 10 + k;
                        if(r == i*i*i + j*j*j + k*k*k)
                            printf("%d
    ",r);
                    }
            }
        }
        return 0;
    }

    习题2-2 韩信点兵

    相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人 一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组 数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c< 7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件 结束为止。
    样例输入:
    2 1 6
    2 1 3
    样例输出:
    Case 1: 41
    Case 2: No answer

    #include<iostream>
    using namespace std;
    int main(){
        int a,b,c;
        int sum;
        cin >>a>>b>>c;
        for(int i = 10;i<=100;i++){
            if( i%3 == a && i%5 == b && i%7 ==c){
                sum = i;
                cout <<sum;
                break;
            }
        }
        if(sum < 10 || sum > 100)
            cout<<"No answer";
        return 0;
    }

    习题2-3 倒三角形

    输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
    #########

     #######

      #####

       ###

        #

    #include<stdio.h>
    int main(){
        int n;
        scanf("%d",&n);
        for(int i =0;i < n;i++){
            for(int j = 0;j < i;j++)
                printf(" ");
            for(int k = 0;k < 2 *(n-i) -1;k++)
                printf("#");
            printf("
    ");
        }
        return 0;
    }

    习题2-4 子序列的和

    输入两个正整数n<m<10^6,输出 ,保留5位小数。输入包含多组数据, 结束标记为n=m=0。提示:本题有陷阱。

    样例输入:
    2 4
    65536 655360
    0 0
    样例输出:
    Case 1: 0.42361
    Case 2: 0.00001

     int 类型占4个字节,每个字节占8位,所以一共有32位,除去一位符号位,也就31位,能表示整数大小是2^31 次方 2^10约等于10^3 所以 2^31约等于10^9

    在进行n^2 + 大数乘法 时极易溢出,所以采用 __64 关键字 ————指定一个64位的整型变量

    #include<stdio.h>
    int main(){
        __int64 n,m;
        __int64 cas = 0;
        while(scanf("%I64d %I64d",&n,&m) == 2 &&n &&m){
            double sum = 0.0;
            cas++;
            for(__int64 i =n;i<=m;i++){
                sum += 1.0 / (double) (i*i);
            }
            printf("case %I64d:%.5f
    ",cas,sum);
        }
        return 0;
    }

    一般来说,更适合使用 long long x; 解决此类问题 

    题目地址

    #include<stdio.h>
    
    int main(){
        int n ;
        long long a,b,c;
        scanf("%d",&n);
        int i = 1;
        while(n--){
            
            scanf("%lld %lld %lld",&a,&b,&c);
            if(a + b > c){
                printf("Case #%d: true
    ",i);
                
            }else{
                printf("Case #%d: false
    ",i);
            }
            i++; 
        }
        return 0;
    }

    习题2-5 分数化小数

    输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤10^6,c≤100。输 入包含多组数据,结束标记为a=b=c=0。
    样例输入:
    1 6 4
    0 0 0
    样例输出:
    Case 1: 0.1667

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main(){
        int a,b,c;
        while(true){
            cin >>a>>b>>c;
            if(a ==0 && b==0 && c==0)
                break;
            printf("%.*f
    ",c,(double) a / b);
        }
        return 0;
    }
    //类似的—————— printf("%*.*f
    ", m, n, ch); 前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n

    习题2-6 排列

    用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必 太动脑筋。

    #include<stdio.h>
    int main(){
        int a,b,c,d,e,f,g,h,i;
        for(a=1;a<=9;a++)
        for(b=1;b<=9;b++)
        for(c=1;c<=9;c++)
        for(d=1;d<=9;d++)
        for(e=1;e<=9;e++)
        for(f=1;f<=9;f++)
        for(g=1;g<=9;g++)
        for(h=1;h<=9;h++)
        for(i=1;i<=9;i++)
        if(2*(a*100+b*10+c) == d*100+e*10+f && 3*(a*100+b*10+c) == g*100+h*10+i
        && a!=b && a != c && a != d && a!=e && a!=f && a != g && a != h && a!= i
                && b != c && b != d && b!=e && b!=f && b != g && b != h && b!= i
                          && c != d && c!=e && c!=f && c != g && c != h && c!= i
                                    && d!=e && d!=f && d != g  && c!= h && d!= i
                                            && e!=f && e != g  && e!= h && e!= i
                                                    && f != g  && f!= h && f!= i
                                                               && g!= h && g!= i
                                                                           && h!= i)
          printf("%d %d %d
    ",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);
        return 0;
    }


    下面是一些思考题。
    题目1。假设需要输出2,4,6,8,…,2n,每个一行,能不能通过对程序2-1进行小小 的改动来实现呢?为了方便,现把程序复制如下:

    #include<stdio.h> 
    int main() 
     {  
       int n; 
       scanf("%d", &n); 
       for(int i = 1; i <= n; i++) 
       printf("%d
    ", i); 
       return 0; 
     }

    修改后:

    #include<stdio.h>
    int main()
     {
       int n;
       scanf("%d", &n);
       for(int i = 1; i <= n; i++)
       printf("%d
    ", i*2);
       return 0;
     }

    任务1:修改第7行,不修改第6行。

    #include<stdio.h>
    int main()
     {
       int n;
       scanf("%d", &n);
       for(int i = 1; i <= n; i++)
       printf("%d
    ", i*2);
       return 0;
     }


    任务2:修改第6行,不修改第7行。

    #include<stdio.h>
    int main()
     {
       int n;
       scanf("%d", &n);
       for(int i = 2; i <= n*2; i+=2)
       printf("%d
    ", i);
       return 0;
     }


    题目2。下面的程序运行结果是什么?“!=”运算符表示“不相等”。提示:请上机实 验,不要凭主观感觉回答。

    #include<stdio.h>
    int main()
    {
        double i; 
        for(i = 0; i != 10; i += 0.1) 
            printf("%.1f
    ", i);
        return 0;
    }

     

     

  • 相关阅读:
    手机浏览器
    一招封住360流氓
    原来在Delphi中的类型是严格匹配的
    Windows 7下面3389远程连接时“超出最大连接数”解决办法
    大家开发过淘宝商城API应用的么?
    adodb.recordset 添加记录后无法取得ID
    VBATrack Picture
    java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化
    VBATrack MsgBox
    VBATrack 暂停3秒运行
  • 原文地址:https://www.cnblogs.com/expedition/p/11450512.html
Copyright © 2020-2023  润新知