• 集美大学 - 2840 - 实验4-1


    实验4-1-1-while和do-while 最大公约数和最小公倍数

    本题要求两个给定正整数的最大公约数和最小公倍数

    输入格式:
    输入在一行中给出两个正整数M和N(≤1000)。

    输出格式:
    在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

    输入样例:

    511 292
    
    • 1

    输出样例:

    73 2044
    
    • 1
    #include
    
    int main() {
        int x, y, t, a, b;
        scanf("%d %d", &x, &y);
        a = x, b = y;
        while (b != 0) {
            t = a % b;
            a = b;
            b = t;
        }
        int cnt = 2;
        if (x % y == 0 || y % x == 0) {
            if (x > y) x = x;
            else x = y;
        } else {
            while (1) {
                if ((cnt * x) % y == 0) {
                    x = x * cnt;
                    break;
                }
                cnt++;
            }
        }
        printf("%d %d", a, x);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    说明:

    1. 在C++里面,求最大公约数可以使用__gcd
    2. 最小公倍数 l c m = a b g c d lcm=\frac{ab}{gcd} lcm=gcdab

    实验4-1-2-while和do-while 求奇数和

    本题要求计算给定的一系列正整数中奇数的和。

    输入格式:
    输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。

    输出格式:
    在一行中输出正整数序列中奇数的和。

    输入样例:

    8 7 4 3 70 5 6 101 -1
    
    • 1

    输出样例:

    116
    
    • 1
    #include
    
    int main() {
        int x;
        int sum = 0;
        scanf("%d", &x);
        while (x > 0) {
            if (x % 2 != 0) sum = sum + x;
            scanf("%d", &x);
        }
        printf("%d", sum);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    实验4-1-3 -for 找出最小值

    本题要求编写程序,找出给定一系列整数中的最小值。

    输入格式:
    输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。

    输出格式:
    在一行中按照“min = 最小值”的格式输出n个整数中的最小值。

    输入样例:

    4 -2 -123 100 0
    
    • 1

    输出样例:

    min = -123
    
    • 1
    #include
    
    int main() {
        int n;
        scanf("%d", &n);
        int cnt = 1;
        int a;
        scanf("%d", &a);
        int x;
        if (n == 1) printf("min = %d", a);
        else {
            while (cnt <= n - 1) {
                scanf("%d", &x);
                if (a <= x) a = a;
                else a = x;
                cnt++;
            }
            printf("min = %d", a);
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    实验4-1-4-while和do-while 求整数的位数及各位数字之和

    对于给定的正整数N,求它的位数及其各位数字之和。

    输入格式:
    输入在一行中给出一个不超过 1 0 9 10^9 109
    的正整数N。

    输出格式:
    在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

    输入样例:

    321
    
    • 1

    输出样例:

    3 6
    
    • 1
    #include
    
    int main() {
        int N;
        scanf("%d", &N);
        int cnt = 0;
        int sum = 0;
        while (N != 0) {
            int y;
            y = N % 10;
            N = N / 10;
            sum = sum + y;
            cnt++;
        }
        printf("%d %d", cnt, sum);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    实验4-1-5-while和do-while 韩信点兵

    在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

    • 按从1至5报数,记下最末一个士兵报的数为1;
    • 再按从1至6报数,记下最末一个士兵报的数为5;
    • 再按从1至7报数,记下最末一个士兵报的数为4;
    • 最后按从1至11报数,最末一个士兵报的数为10;

    请编写程序计算韩信至少有多少兵。

    输入格式:
    本题无输入

    输出格式:
    输出韩信至少拥有的士兵人数。

    #include
    
    int main() {
        int cnt = 1;
        for (cnt = 1;; cnt++) {
            if (cnt % 5 == 1 && cnt % 6 == 5 && cnt % 7 == 4 && cnt % 11 == 10) break;
        }
        printf("%d", cnt);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    实验4-1-6 -for 求分数序列前N项和

    本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

    输入格式:
    输入在一行中给出一个正整数N。

    输出格式:
    在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

    输入样例:

    20
    
    • 1

    输出样例:

    32.66
    
    • 1
    #include
    
    int main() {
        int N;
        scanf("%d", &N);
        int cnt = 1;
        double sum = 0;
        double a, b;
        a = 1;
        b = 2;
        while (cnt <= N) {
            double t;
            sum = sum + b / a;
            t = b;
            b = a + b;
            a = t;
            cnt++;
        }
        printf("%.2f", sum);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    实验4-1-7 -for 特殊a串数列求和

    给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

    输入格式:
    输入在一行中给出不超过9的正整数a和n。

    输出格式:
    在一行中按照“s = 对应的和”的格式输出。

    输入样例:

    2 3
    
    • 1

    输出样例:

    s = 246
    
    • 1
    #include
    #include
    
    int main() {
        int a, n, x, sum = 0, m;
        scanf("%d %d", &a, &n);
        x = pow(10, n);
        m = a;
        while (a < x) {
            sum = sum + a;
            a = 10 * a + m;
        }
        printf("s = %d", sum);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    实验4-1-8-while和do-while 求给定精度的简单交错序列部分和

    本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + … 直到最后一项的绝对值不大于给定精度eps。

    输入格式:
    输入在一行中给出一个正实数eps。

    输出格式:
    在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

    输入样例1:

    4E-2
    
    • 1

    输出样例1:

    sum = 0.854457
    
    • 1

    输入样例2:

    0.02
    
    • 1

    输出样例2:

    sum = 0.826310
    
    • 1
    #include
    #include
    
    int main() {
        double eps, sum = 0;
        double x = 1;
        scanf("%lf", &eps);
        if (eps >= 1) sum = 1;
        else {
            while (1 / (3 * x - 2) >= eps) {
                sum = sum + pow(-1, x + 1) / (3 * x - 2);
                x++;
            }
        }
        printf("sum = %f", sum);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    实验4-1-9 -while和do-while/if-else 猜数字游戏

    猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

    输入格式:
    输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

    输出格式:
    在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

    输入样例:

    58 4
    70
    50
    56
    58
    60
    -2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出样例:

    Too big
    Too small
    Too small
    Good Guess!
    
    • 1
    • 2
    • 3
    • 4
    #include
    
    int main() {
        int rand_number, x, cnt = 1, N;
        scanf("%d", &rand_number);
        scanf("%d", &N);
        while (cnt <= N) {
            scanf("%d", &x);
            if (x < 0) break;
            if (x > rand_number) printf("Too big\n");
            else if (x < rand_number) printf("Too small\n");
            else if (x == rand_number) break;
            cnt++;
        }
        if (x == rand_number && cnt <= N) {
            if (cnt == 1)printf("Bingo!");
            else if (cnt == 2 || cnt == 3)printf("Lucky You!");
            else printf("Good Guess!");
        } else if (x < 0 || cnt > N) printf("Game Over");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    说明:这是一个假随机数,相当于说你输入的第一个数字就是要猜的随机数。

    实验4-1-10-while和do-while 兔子繁衍问题

    一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

    输入格式:
    输入在一行中给出一个不超过10000的正整数N。

    输出格式:
    在一行中输出兔子总数达到N最少需要的月数。

    输入样例:

    30
    
    • 1

    输出样例:

    9
    
    • 1
    #include
    
    int f(int x) {
        if (x == 1 || x == 2) return 1;
        else return f(x - 1) + f(x - 2);
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        int i = 1;
        while (1) {
            if (f(i) >= n) {
                printf("%d", i);
                break;
            }
            i++;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    说明:这就是一个斐波那契数列。

    实验4-1-11-for 高空坠球

    皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

    输入格式:
    输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

    输出格式:
    在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

    输入样例:

    33 5
    
    • 1

    输出样例:

    94.9 1.0
    
    • 1
    #include
    #include
    
    int main() {
        long long height, n;
        long long cnt = 2;
        scanf("%lld %lld", &height, &n);
        double a = height, b;
        if (n == 1) printf("%.1f %.1f", (double) height, (double) height / 2);
        else if (n > 1) {
            while (cnt <= n) {
                a = a + pow((double) 1 / 2, cnt - 2) * height;
                b = pow((double) 1 / 2, cnt) * height;
                cnt++;
    
            }
            printf("%.1f %.1f\n", a, b);
        } else if (n == 0) printf("0.0 0.0");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    实验4-1-12-while和do-while 黑洞数

    黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

    任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)

    例如,对三位数207:

    • 第1次重排求差得:720 - 27 = 693;
    • 第2次重排求差得:963 - 369 = 594;
    • 第3次重排求差得:954 - 459 = 495;

    以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。

    任意输入一个三位数,编程给出重排求差的过程。

    输入格式:
    输入在一行中给出一个三位数。

    输出格式:
    按照以下格式输出重排求差的过程:

    序号: 数字重排后的最大数 - 重排后的最小数 = 差值
    序号从1开始,直到495出现在等号右边为止。

    输入样例:

    123
    
    • 1

    输出样例:

    1: 321 - 123 = 198
    2: 981 - 189 = 792
    3: 972 - 279 = 693
    4: 963 - 369 = 594
    5: 954 - 459 = 495
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #include
    
    int max(int x) {
        int a, b, c;
        a = x / 100;
        b = x % 100 / 10;
        c = x % 10;
        if (a >= b && a >= c) {
            if (b >= c) return 100 * a + 10 * b + c;
            else return 100 * a + 10 * c + b;
        } else if (b >= a && b >= c) {
            if (a >= c) return 100 * b + 10 * a + c;
            else return 100 * b + 10 * c + a;
        } else if (c >= a && c >= b) {
            if (a >= b) return 100 * c + 10 * a + b;
            else return 100 * c + 10 * b + a;
        }
    }
    
    int min(int x) {
        int a, b, c;
        a = x / 100;
        b = x % 100 / 10;
        c = x % 10;
        if (a >= b && a >= c) {
            if (b >= c) return 100 * c + 10 * b + a;
            else return 100 * b + 10 * c + a;
        } else if (b >= a && b >= c) {
            if (a >= c) return 100 * c + 10 * a + b;
            else return 100 * a + 10 * c + b;
        } else if (c >= a && c >= b) {
            if (a >= b) return 100 * b + 10 * a + c;
            else return 100 * a + 10 * b + c;
        }
    }
    
    int main() {
        int m;
        int cnt = 1;
        scanf("%d", &m);
        int a;
        if (m == 495)printf("1: 954 - 459 = 495");
        while (m != 495) {
            a = m;
            m = max(m) - min(m);
            printf("%d: %d - %d = %d\n", cnt, max(a), min(a), max(a) - min(a));
            cnt++;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    C Primer Plus(6) 中文版 第10章 数组和指针 10.4 函数、数组和指针
    map 和 set 的介绍
    【JavaEE初阶】 线程池详解与实现
    相机内外参实践之点云投影矢量图
    如何免费下载百度指数数据
    P2241 统计方形(数据加强版)
    【安全体系架构】——防御深度架构
    【COMP305 LEC 8】
    Dart 笔记:函数
    .NET周刊【5月第3期 2024-05-19】
  • 原文地址:https://blog.csdn.net/im34v/article/details/126551651