zoukankan      html  css  js  c++  java
  • 算法竞赛入门经典_第二章:循环结构程序设计_上机练习_MyAnswer

    习题2-1 位数

    输入一个不超过109的正整数,输出它的位数。例如12735的位数是5。请不要使用任何数学函数,只用四则运算和循环语句实现。

    #include<stdio.h>
    int main(void)
    {
        int n;
        int digit = 0;
        scanf("%d",&n);
        
        while(n)
        {
            n = n / 10;
            digit++;
        }
        
        printf("%d
    ", digit);
        return 0;
    }

    习题2-2 水仙花数

    输出100~999中的所有水仙花数。若3位数ABC满足ABC = A3 + B3 + C3,则称其为水仙花数。例如153 = 13 + 53 + 33,所以153是水仙花数。

    #include<stdio.h>
    int main(void)
    {
        int a, b, c, i;
        
        for(i = 100; i < 1000; i++)
        {
            a = i / 100;
            b = i / 10 - a * 10;
            c = i % 10;
            if(i == a*a*a + b*b*b + c*c*c)
                printf("%d
    ", i);        
        }
        
        return 0;
    }
    // 输出结果: 153 370 371 407

    习题2-3 韩信点兵

    相信韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c,表示每种队形排尾的人数(a < 3,b < 5,c < 7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。

    样例输入:2 1 6  样例输出:41

    样例输入:2 1 3  样例输出:No answer

    #include<stdio.h>
    int main(void)
    {
        int a, b, c, i;
        scanf("%d%d%d", &a, &b, &c);
        
        for(i = 10; i <= 100; i++)
        {
            if(i%3 == a && i%5 == b && i%7 == c) // 不清楚运算符优先级的最好用()括起来
            {
                printf("%d", i);
                break;
            }
        }
    
        if(i == 101)
            printf("No answer
    ");
        return 0;
    }

    习题2-4 倒三角形

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

    #########

     #######

      #####

       ###

        #

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

    习题2-5 统计

    输入一个正整数n,然后读取n个正整数a1,a2,...,an,最后再读一个正整数m。统计a1,a2,...,an,中有多少个整数的值小于m。提示:如果重定向和fopen都可以使用,哪个比较方便?

    #include<stdio.h>
    int main(void)
    {
        // 没有采用重定向的方式,因为用这种方式,我不知道如何二次打开一个文件。
        // freopen("E:/desktop/input.txt", "r", stdin);
        // freopen("E:/desktop/output.txt", "w", stdout);
        
        FILE * fin;
        FILE * fout;
        
        fin = fopen("E:/desktop/input.txt", "rb"); // 存放在桌面上
        fout = fopen("E:/desktop/output.txt", "wb");
        
        int n, number, m;
        int count = 0;
        fscanf(fin, "%d", &n);
        
        while(n--)
        {
            fscanf(fin, "%d", &number);
        }
        
        fscanf(fin, "%d", &m);
        
        rewind(fin); // 文件指针重新指向文件开头
        
        fscanf(fin, "%d", &n);
        while(n--)
        {
            fscanf(fin, "%d", &number);
            if(number < m)
                count++;
        }
    
        fprintf(fout, "%d
    ", count);
        
        fclose(fin);
        fclose(fout);
        return 0;
    }

    习题2-6 调和级数

    输入正整数n,输出H(n) = 1 + 1/2 + 1/3 + ... + 1/n 的值,保留3位小数。例如 n = 3时答案为1.833。

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

    习题2-7 近似计算

    计算π/4 = 1 - 1/3 + 1/5 - 1/7 +...,直到最后一项小于10-6

    #include<stdio.h>
    #include<math.h>
    int main(void)
    {
        int n = 1; 
        double sum = 0;
        
        while(1)
        {    
            sum += 1.0 / n;
            n = n > 0 ? n+2 : n-2;
            n = -n;
            if(fabs(1.0/n) < 1E-6)
            {
                break;
            }
        }
        
        printf("%lf
    ", sum);
        return 0;
    }

    习题2-8 子序列的和

    输入两个正整数 n < m < 106,输出 1/n2 + 1/(n+1)2 +...+ 1/m2,保留5位小数。例如 n = 2,m = 4时答案是0.42361;n = 65536,m = 655360时答案为0.00001。注意:本题有陷阱。

    #include<stdio.h>
    int main(void)
    {
        int m, n, i;
        double sum = 0;
        
        scanf("%d%d", &n, &m);
        for(i = n; i <= m; i++)
        {
            // 两种方式皆可防止整形溢出
            // sum += 1.0 /( (long long int)i*i);
            
            sum += 1.0 / i / i;
        }
        
        printf("%.5lf
    ", sum);
        
        return 0;
    }

    习题2-9 分数化小数

    输入正整数a,b,c,输出 a / b 的小数形式,精确到小数点后c位。a,b ≤ 106,,c ≤ 100。例如 a = 1,b = 6,c = 4时应该输出0.1667。

    #include<stdio.h>
    double roundNum(double, int); // 该函数用于实现四舍五入
    #include<math.h>
    int main(void)
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        
        double value = 1.0 * a / b;
        double frac;
    
        printf("%d.", (int)value); // 这里必须强制类型转换
        frac = value - (int)value; // 得到小数部分
        frac = roundNum(frac, c);
        
        while(c--)
        {
            frac *= 10;
            printf("%d", (int)frac);
            frac = frac - (int)frac;
        }
        
        return 0;
    }
    
    double roundNum(double frac, int c)
    {
        int i;
        double temp = 0.5;
        
        while(c--)
            temp /= 10;
        
        return temp+frac;
    }
    

    有趣的是前几天看《数据结构与算法:C语言描述》时遇到过极相似的问题,特别记录在了这里

    习题2-10 排列

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

    #include<stdio.h>
    int main(void)
    {
        int a, b, c, d, e, f, g, h, i;
        for(a = 1; a <= 9; a++)
            for(b = 1; b <= 9; b++)
                if(a!=b)
                    for(c = 1; c <= 9; c++)
                        if(c!=a && c!=b)
                            for(d = 1; d <= 9; d++)
                                if(d!=a && d!=b && d!= c)
                                    for(e = 1; e <= 9;e++)
                                        if(e!=a && e!=b && e!=c && e!=d)
                                            for(f = 1; f <= 9; f++)
                                                if(f!=a && f!=b && f!=c && f!=d && f!=e)
                                                    for(g = 1; g <= 9; g++)
                                                        if(g!=a && g!=b && g!=c && g!=d && g!=e && g!=f)
                                                            for(h = 1; h <= 9; h++)
                                                                if(h!=a && h!=b && h!=c && h!=d && h!=e && h!=f && h!=g)
                                                                    for(i = 1; i <= 9; i++)
                                                                        if(i!=a && i!=b && i!=c && i!=d && i!=e && i!=f && i!=g && i!=h)
                                                                        {
                                                                            int n1 = a*100 + b*10 + c;
                                                                            int n2 = d*100 + e*10 + f;
                                                                            int n3 = g*100 + h*10 + i;
                                                                            
                                                                            if(n1*2== n2 && n1*3==n3)
                                                                                printf("%d %d %d
    ", n1, n2, n3);
                                                                        }                
        return 0;
    }
    
    /*
    数出结果:
    192 384 576 219 438 657 273 546 819 327 654 981
    */
    All Rights Reserved.
    Author:海峰:)
    Copyright © xp_jiang. 
    转载请标明出处:http://www.cnblogs.com/xpjiang/p/4156314.html
  • 相关阅读:
    如何辨别护照的种类
    C#枚举中使用Flags特性
    那些年,我们一起学WCF--(7)PerSession实例行为
    64位系统使用Access 数据库文件的彻底解决方法
    从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法
    TortoiseSVN与VisualSVN Server搭建SVN版本控制系统
    解决Winform程序在不同分辨率系统下界面混乱
    【已解决】Https请求——基础连接已经关闭 发送时发生错误
    Entity Framework Code First学习系列目录
    PowerDesigner之PDM(物理概念模型)各种属性建立如PK,AK等
  • 原文地址:https://www.cnblogs.com/xpjiang/p/4156314.html
Copyright © 2011-2022 走看看