• 《算法竞赛入门经典》第二章精选


    例2-4 文件读写(freopen重定向)

      题目:输入一些整数,求出他们的最小值、最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000的整数。

      样例输入:2 8 3 5 1 7 3 6

      样例输出:1 8 4.375

    #include<stdio.h>
    #define INF 1000000000
    
    int file_freopen()
    {
        int x,min=INF,max=-INF,S=0,count=0;
        freopen("E:\Code\C\算法竞赛入门经典\Debug\input.txt","r",stdin);
        freopen("E:\Code\C\算法竞赛入门经典\Debug\output.txt","w",stdout);
        while(scanf("%d",&x)==1)
        {
            S+=x;
            if(x<min) min=x;
            if(x>max) max=x;
            count++;
        }
        printf("%d %d %.3lf
    ",min,max,(double)S/count);
    
        return 0;
    }

    例2-4 文件读写(fopen)

    #include<stdio.h>
    #define INF 1000000000
    
    int file_fopen()
    {
        int x,min=INF,max=-INF,S=0,count=0;
        FILE *fin,*fout;
        fin = fopen("E:\Code\C\算法竞赛入门经典\Debug\input.txt","rb");
        fout = fopen("E:\Code\C\算法竞赛入门经典\Debug\output.txt","wb");
        while(fscanf(fin,"%d",&x)==1)
        {
            S+=x;
            if(x<min) min=x;
            if(x>max) max=x;
            count++;
        }
        fprintf(fout,"%d %d %.3lf
    ",min,max,(double)S/count);
        fclose(stdin);
        fclose(stdout);
    
        return 0;
    }

    习题2-2 水仙花数(daffodil)

      题目:输出100 ~ 999中的所有水仙花数,若3位数ABC满足ABC = A3 + B3 + C3,则称其为水仙花数。例如153 = 13 + 53 + 33,所以153是水仙花数。
      分析:考查的是循环的用法。
      源码

    #include<stdio.h>
    
    int daffodil()
    {
        int a,b,c,x;
        for(a=1;a<=9;a++)
        {
            for(b=0;b<=9;b++)
            {
                for(c=0;c<=9;c++)
                {
                    x=a*100+b*10+c;
                    if(x==a*a*a+b*b*b+c*c*c)    //ABC=A*A*A+B*B*B*C*C*C
                        printf("%d
    ",x);
                }
            }
        }
    
        return 0;
    }

      运行结果

      

    习题2-4 倒三角形(triangle)

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

      

      分析:考查的是循环的用法,注意空格和#于层数之间的关系。
      源码

    #include<stdio.h>
    
    int triangle()
    {
        int n,i,j,k;                    //共n行
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<i;j++)            //第i行先打印i-1个空格
                printf(" ");
            for(k=1;k<=2*n-(2*i-1);k++)    //第i行再打印2n-(2i-1)个#
                printf("#");
            printf("
    ");    
        }
    
        return 0;
    }

    习题2-8 子序列的和(subsequence)

      题目:输入两个正整数n<m<106,输出1/n2 + 1/(n+1)2 + …… + 1/m2,保留5位小数。例如n=2,m=4时答案是0.42361;n=65536,m=655360时答案为0.00001。注意:本题有陷阱。
      分析:本题陷阱在于n比较大时,n*n会溢出,所以 1/n2 应该用 1/n/n 而不是 1/(n*n)
      源码

    #include<stdio.h>
    
    int subsequence()
    {
        int n,m,i;
        double sum=0.0;
        scanf("%d%d",&n,&m);
        for(i=n;i<=m;i++)
        {
            sum+= 1.0/i/i;    //防止i*i溢出
        }
        printf("%.5lf
    ",sum); 
    
        return 0;
    }

    习题2-10 排列(permutation)

      题目:用1,2,3,……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3。输出所有解。提示:不必太动脑筋。
      分析:利用数组,sign[1]~sign[9]初始赋值为0,令sign[出现的数字] = 1,若sign[1] + sign[2] + …… +sign[9] == 9,则9个数字本次均出现一次。
      源码

    #include<stdio.h>
    
    int permutation()
    {
        int abc, def, ghi, sign[10] = {0};    //数组sign的初始值为0,当1,2,3,……,9中某一数字出现就令对应下标的数组元素为1
        int i, sign_sum = 0;  
        for(abc = 100; abc < 333; abc++)    //abc一定小于333
        {  
            def = 2*abc;  
            ghi = 3*abc;  
            /*令 sign[在三位数的百位、十位、个位出现的数字] = 1*/  
            sign[abc/100] = sign[abc/10%10] = sign[abc%10] = 1;  
            sign[def/100] = sign[def/10%10] = sign[def%10] = 1;  
            sign[ghi/100] = sign[ghi/10%10] = sign[ghi%10] = 1;  
            for(i = 1; i <= 9; i++)        //将sign相加,若和为9则1~9全部数字都出现一次
                sign_sum += sign[i];  
            if(sign_sum == 9)  
                printf("%d	%d	%d
    ",abc,def,ghi);  
            for(i = 1; i <= 9; i++)        //数组sign重新赋值为0  
                sign[i] = 0;  
            sign_sum=0;                    //sign_sum置0
        }  
    
        return 0;
    }

      运行结果

      

  • 相关阅读:
    du命令、df命令、磁盘分区
    du命令、df命令、磁盘分区
    C#中类和结构体的区别
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    JAVA并查集
    JAVAPrim最小生成树
    自媒体创业怎么起步?如何选择自媒体平台?
    如何在互联网创业?有什么好的技巧?
  • 原文地址:https://www.cnblogs.com/eniac12/p/4730685.html
Copyright © 2020-2023  润新知