• 《算法竞赛入门经典》 第二章 循环结构程序设计 习题


    注:这里为了便于测试,直接使用stdin,stdout进行输出,没有进行文件读写操作。

    习题2-1 位数(digit)

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

    #include <iostream>

    using namespace std;

    int main() {

        int n;

        while (cin >> n) {

            int cnt = 0;

            while (n) {

                n /= 10;

                cnt ++;

            }

            cout << cnt << endl;

        }

        return 0;

    }

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

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

    #include <iostream>

    using namespace std;

    int main() {

        for (int i = 100; i < 1000; i ++) {

            int a = i / 100;

            int b = i / 10 % 10;

            int c = i % 10;

            if (i == a * a * a + b * b * b + c * c * c)

                cout << i << endl;

        }

        return 0;

    }

    习题2-3 韩信点兵(hanxin)

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

    样例输入:2 1 6

    样例输出:41

    样例输入:2 1 3

    样例输出:No answer

    #include <iostream>

    using namespace std;

    int main() {

        int a , b, c, x;

        while (cin >> a >> b >> c) {

            for (x = 10; x <=100; x ++)

            if (x % 3 == a && x % 5 == b && x % 7 == c) {

                cout << x << endl;

                break;

            }

            if (x > 100)

                cout << "No Andwer" << endl;

        }

        return 0;

    }

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

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

    #########

     #######

      #####

       ###

        #

    #include <iostream>

    #include <cstdio>

    using namespace std;

    int main() {

        int n;

        while (cin >> n) {

            for (int i = 0; i < n; i ++) {

                for (int j = 0; j < i; j ++)

                    putchar(' ');

                for (int j = 1; j < 2*(n-i); j ++)

                    putchar('#');

                putchar(' ');

            }

        }

        return 0;

    }

    习题2-5 统计(stat)

    输入一个正整数n,然后读取n个正整数a1,a2,...,an,最后再读一个正整数m。统计a1,a2,...,an中了有多少个整数的值小于m。

    #include <iostream>

    #include <cstdio>

    using namespace std;

    int main() {

        int n, m, a[1000], c;

        while (cin >> n) {

            for (int i = 0; i < n; i ++) cin >> a[i];

            cin >> m;

            c = 0;

            for (int i = 0; i < n; i ++)

                if (a[i] < m)

                    c ++;

            cout << c << endl;

        }

        return 0;

    }

    习题2-6 调和级数(harmony)

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

    #include <iostream>

    #include <cstdio>

    using namespace std;

    int main() {

        int n;

        double x;

        while (cin >> n) {

            x = 0;

            for (int i = 1; i <= n; i ++)

                x += 1.0 / (double) i;

            printf("%.3lf ", x);

        }

        return 0;

    }

    习题2-7 近似计算(approximation)

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

    #include <iostream>

    #include <cstdio>

    using namespace std;

    int main() {

        double pi4 = 0, pi, flag = 1.;

        for (int i = 0; i*2+1 < 1000000; i ++) {

            pi4 += flag / (double) (i*2+1);

            flag = - flag;

        }

        cout << pi4 << endl;

        pi = pi4 * 4;

        cout << pi << endl;

        return 0;

    }

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

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

    #include <iostream>

    #include <cstdio>

    #include <cmath>

    using namespace std;

    int main() {

        int n, m;

        while (cin >> n >> m) {

            double ans = 0;

            if (n > m) swap(n, m);

            for (int i = n; i <= m; i ++) {

                ans += 1.0 / pow(1. * i, 2.0);

            }

            printf("%.5lf ", ans);

        }

        return 0;

    }

    习题2-9 分数化小数(decimal)

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

    #include <iostream>

    #include <cstdio>

    #include <cmath>

    using namespace std;

    int main() {

        int a, b, c;

        while (cin >> a >> b >> c) {

            cout << a / b;

            if (c > 1)

                cout << ".";

            a %= b;

            while (c --) {

                a *= 10;

                if (c)

                    cout << a / b;

                else {

                    if (a % b * 10 / b >= 5)

                        cout << a / b + 1;

                    else

                        cout << a / b;

                }

                a %= b;

            }

            cout << endl;

        }

        return 0;

    }

    习题2-10 排列(permutation)

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

    #include <iostream>

    using namespace std;

    int main() {

        for (int i = 1; i <= 3; i ++)

        for (int j = 1; j <= 3; j ++) {

            if (i == j) continue;

            for (int k = 1; k <= 3; k ++) {

                if (k == i || k == j) continue;

                int x = i * 100 + j * 10 + k;

                cout << x << " " << 2 * x << " " << 3 * x << endl;

            }

        }

        return 0;

    }

  • 相关阅读:
    js事件的一些兼容写法
    js数据劫持 Object.defineProperty() 作用
    Java并发编程(三):ReentrantLock
    Idea使用插件实现逆向工程搭建SpringBoot项目
    Java并发编程(二):volatile关键字
    Java并发编程(一):线程基础知识以及synchronized关键字
    Docker快速上手之部署SpringBoot项目
    JVM基础快速入门篇
    linq 多表分组左连接查询查询统计
    Expression表达式目录树
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5621744.html
Copyright © 2020-2023  润新知