C语言习题05_数学

本文提供了一系列C语言编程习题,涉及最大公约数与最小公倍数计算、数列求和、梯形法求积分、水仙花数的查找、牛顿迭代法求根、特定条件的数的搜索、人民币换零钱问题、求和问题、细菌繁殖、数字序列求和、奇数乘积计算、时间计算、打印三角形、回文数字判断等多个方面,涵盖了基础算法与数学应用的综合练习。
摘要由CSDN通过智能技术生成

C语言习题05_数学

习题05(01)最大公约数

题目描述
输入两个正整数 m 和 n,求其最大公约数和最小公倍数。
输入描述
输入为整型
输出描述
输出为整型(输出里的冒号为中文冒号)
输入样例
12,15
输出样例
最大公约数为:3
最小公倍数为:60
#include <stdio.h>
int main()
{
    int m, n, x, y, r;
    scanf("%d,%d", &m, &n);
    x = m;
    y = n;
    r = x % y;
    while (r != 0)
    {
        x = y;
        y = r;
        r = x % y;
    }
    printf("最大公约数为:%d\n", y);
    printf("最小公倍数为:%d\n", m * n / y);
    return 0;
}

习题05(02) 数列和

题目描述
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13……,求该数列的前 n 项之和。
输入描述
输入计算的项数(整数)
输出描述
输出和为浮点数据,小数点后保留 4 位
输入样例
3
输出样例
前 3 项的和=5.1667
#include <stdio.h>
int main()
{
    int i, n;
    double x, y, t, sum;
    sum = 0;
    x = 2.0;
    y = 1.0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        sum = sum + x / y;
        t = x;
        x = x + y;
        y = t;
    }
    printf("前%d 项的和=%.4lf\n", n, sum);
    return 0;
}

习题05(03) 梯形法求积分

题目描述
用梯形法求(2x^5+5x^3)dx 的积分。
输入描述
依次输入积分起点(双精度),终点(双精度),步数(整数)
输出描述
结果(双精度)
输入样例
2,3,1000
输出样例
302.92
#include <stdio.h>
#include <math.h>
int main()
{
    double a, b, s, x, t;
    int i, n;
    s = 0;
    scanf("%lf,%lf,%d", &a, &b, &n);
    x = (1.0 * (b - a) / n);
    t = (a + a + x) / 2;
    for (i = 0; i < n; i++)
    {
        s = s + (2 * pow(t, 5) + 5 * pow(t, 3)) * x;
        t = t + (b - a) / n;
    }
    printf("%.2lf\n", s);
    return 0;
}

习题05(04) 水仙花数

题目描述
输出所有的水仙花数,所谓水仙花数是指一个 3 位数,其各位数字立方和等于该数本身。
输出描述
每行输出一个水仙花数,按从小到大的顺序输出。
输出样例
153
370
371
407
#include <stdio.h>
int main()
{
    int a, b, c, x;
    for (x = 100; x < 1000; x++)
    {
        a = x / 100;
        b = x / 10 % 10;
        c = x % 100 % 10;
        if (x == (a * a * a + b * b * b + c * c * c))
        {
            printf("%d\n", x);
        }
    }
    return 0;
}

习题05(05) 牛顿迭代法求根

题目描述
用牛顿迭代法求下面方程在 1.5 附近的根,2x^3-4x^2+3x-6=0。
输出描述
输出只保留小数点后 2 位
输入样例
无
输出样例
2.00
#include <stdio.h>
#include <math.h>
int main()
{
    double x1, x0, f, f1;
    x1 = 1.5;
    do
    {
        x0 = x1;
        f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
        f1 = (6 * x0 - 8) * x0 + 3;
        x1 = x0 - f / f1;
    } while (fabs(x1 - x0) >= 1e-5);
    printf("%.2lf\n", x1);
    return 0;
}

习题05(06) 求满足条件的数

题目描述
编程求出 200~300 之间满足下列条件的数:该数的三个数字之积为 42,三位数字之和为 12。
输出描述
按从小到大的顺序每行输出一个三位数
输入样例
无
输出样例
237
273
#include <stdio.h>
int main()
{
    int a, b, c, x;
    for (x = 200; x <= 300; x++)
    {
        a = x / 100;
        b = x / 10 % 10;
        c = x % 100 % 10;
        if ((a * b * c == 42) && (a + b + c == 12))
        {
            printf("%d\n", x);
        }
    }
    return 0;
}

习题05(07)人民币换零钱

题目描述
用一张 100 元人民币换 5 元、1 元、0.5 元面值的人民币,要求各种面值的人民币至少各一
张,且总张数为 100 张,问共有多少种换法,各种面值分别为多少张?
输出描述
按 printf("5 元:%2d 张,\t1 元:%2d 张,\t0.5 元:%2d\n",i,j,k);格式输出。
输入样例
无
输出样例
5 元: 1 张, 1 元:91 张, 0.5 元: 8
5 元: 2 张, 1 元:82 张, 0.5 元:16
5 元: 3 张, 1 元:73 张, 0.5 元:24
5 元: 4 张, 1 元:64 张, 0.5 元:32
5 元: 5 张, 1 元:55 张, 0.5 元:40
5 元: 6 张, 1 元:46 张, 0.5 元:48
5 元: 7 张, 1 元:37 张, 0.5 元:56
5 元: 8 张, 1 元:28 张, 0.5 元:64
5 元: 9 张, 1 元:19 张, 0.5 元:72
5 元:10 张, 1 元:10 张, 0.5 元:80
5 元:11 张, 1 元: 1 张, 0.5 元:88
总共有 11 种换法
#include <stdio.h>
int main()
{
    int x, a, b, c, i;
    x = 100;
    i = 0;
    for (a = 1; a < 12; a++)
    {
        for (b = 1; b <= 100; b++)
        {
            for (c = 1; c <= 200; c++)
            {
                if ((x == a * 5 + b + 0.5 * c) && (a + b + c == 100))
                {
                    printf("5 元:%2d 张,\t1 元:%2d 张,\t0.5 元:%2d\n", a, b, c);
                    i++;
                }
            }
        }
    }
    printf("总共有%d 种换法\n", i);
    return 0;
}

习题05(08)n 的最大值

题目描述
编写程序求出下式中 n 的最大值:22+42+62+…+n2<m。式子左边是求和的过程,每个
加数的十位数是从 2 开始,偶数递增的,个位数固定为 2。m 由用户输入。
输入描述
m 的值(输入的 m 是一个大于 22 的值)
输出描述
满足条件的 n 的最大值。
输入样例
150
输出样例
6
#include <stdio.h>
int main()
{
    int m, n, sum;
    sum = 0;
    n = 0;
    scanf("%d", &m);
    while (sum < m)
    {
        n = n + 2;
        sum = sum + 10 * n + 2;
    }
    printf("%d\n", n - 2);
    return 0;
}

习题05(09)寻找满足条件的数

题目描述
编写程序找出 m 到 n 之间所有整数中满足如下条件的数:该数的高端两位数字的和与低端
两位数字的和值相等,如 1001, 1120。程序能输出所有满足条件的数以及它们的总个数。
输入描述
m 和 n 的值,m 和 n 均为 4 四位整数,并且 m<n。
输出描述
两行,第一行为找到的所有满足条件的数,第二行为找到的数据个数。
输入样例
1000 1100
输出样例
1001 1010
2
#include <stdio.h>
int main()
{
    int m, n, k, a, b, c, d, t;
    t = 0;
    scanf("%d%d", &m, &n);
    for (k = m; k <= n; k++)
    {
        a = k / 1000;
        b = k % 1000 / 100;
        c = k % 100 / 10;
        d = k % 10;
        if (a + b == c + d)
        {
            printf("%d ", k);
            t++;
        }
    }
    printf("\n");
    printf("%d\n", t);
    return 0;
}

习题05(10)细菌繁殖

题目描述
编程求解问题:有一种细菌,从其产生的第 4 分钟后,每分钟都产生一个同种细菌。若某初
始时刻仅有一个这种细菌,那么此后第 n 分钟时共有多少种这种细菌?
提示:初始时刻(第t=0分钟),a(0)=1,b(0)=c(0)=d(0)=0,细菌总数为s(0)=a(0)+b(0)+c(0)+d(0)=1。
下一时刻 d(t+1)=c(t)+d(t),c(t+1)=b(t),b(t+1)=a(t),a(t+1)=d(t)。
输入描述
输入正整数 n。
输出描述
输出 n+1 个数,表示从开始时刻(第 0 分钟)到第 n 分钟(共 n+1 个时刻),每个所有产生
的细菌数的总数,数据之间用一个空格隔开。
输入样例
10
输出样例
1 1 1 1 2 3 4 5 7 10 14
#include <stdio.h>
int main()
{
    int a, b, c, d, n, t, sum, e;
    a = 1;
    b = 0;
    c = 0;
    d = 0;
    scanf("%d", &n);
    for (t = 0; t <= n; t = t++)
    {
        sum = a + b + c + d;
        e = a;
        a = d;
        d = c + d;
        c = b;
        b = e;
        printf("%d ", sum);
    }
    printf("\n");
    return 0;
}

习题05(11)求 6 个整数中非 0 偶数的积

题目描述
输入 6 个整数,求其中非 0 的偶数积。(用循环完成)
说明:假设输入的 6 个数中至少有一个是非 0 的偶数。
输入描述
输入数据为 6 个整数
输出描述
在一行上输出偶数积。
输入样例
13 12 2 0 3 1
输出样例
24
#include <stdio.h>
int main()
{
    int i, sum;
    int a[6];
    sum = 1;
    for (i = 0; i < 6; i++)
    {
        scanf("%d", &a[i]);
    }
    for (i = 0; i < 6; i++)
    {
        if (a[i] % 2 != 0 || a[i] == 0)
        {
            a[i] = 1;
        }
    }
    for (i = 0; i < 6; i++)
    {
        sum = sum * a[i];
    }
    printf("%d\n", sum);
    return 0;
}

习题05(12)2+22+222+…

题目描述
求 Sn=a+aa+aaa+...+a...a(n 个 a)之值,其中 a 是一个数字,n 表示 a 的个数.
输入描述
例如 2+22+222,此时 n=3,a=2,因此在输入时只需输入:2 3
注意:a 的值是 0~9
输出描述
输出 Sn 的值
输入样例
2 3
输出样例
246
#include <stdio.h>
int main()
{
    int a, n, i, sum, b;
    sum = 0;
    scanf("%d%d", &a, &n);
    b = a;
    if (a >= 0 && a <= 9)
    {
        for (i = 0; i < n; i++)
        {
            sum = sum + a;
            a = b + 10 * a;
        }
        printf("%d\n", sum);
    }
    return 0;
}

习题05(13)求奇数的乘积

题目描述
给你 n 个整数,求他们中所有奇数的乘积。
输入描述
每个测试实例占一行,每行的第一个数为 n,表示本组数据一共有 n 个,接着是 n 个整数,
你可以假设每组数据必定至少存在一个奇数。
输出描述
输出每组数中的所有奇数的乘积,对于测试实例,输出一行。
输入样例
3 1 2 3
输出样例
3
#include <stdio.h>
int main()
{
    int i, n, sum, p;
    while (~scanf("%d", &n))
    {
        sum = 1;
        for (i = 0; i < n; i++)
        {
            scanf("%d", &p);
            if (p % 2 == 1)
            {
                sum = p * sum;
            }
        }
        printf("%d\n", sum);
    }
    return 0;
}

习题05(14)下落的球

一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下。编程
计算气球在第 5 次落地时,共经过多少米? 第 5 次反弹多高?
输入描述
整数 h0,表示球最开始的高度。
输出描述
两个数据 s 和 h,分别表示第 5 次落地时共经过 s 米,第 5 次反弹高度为 h 米,s 和 h 用空
格隔开。
输入样例
10
输出样例
28.75 0.3125
#include <stdio.h>
int main()
{
    int h0, i;
    double h, s;
    s = 0;
    scanf("%d", &h0);
    h = h0;
    for (i = 0; i < 5; i++)
    {
        h = 1.0 / 2 * h;
        s = s + 2 * h;
    }
    s = s - 2 * h;
    s = s + h0;
    printf("%.2lf %.4lf\n", s, h);
    return 0;
}

习题05(15)输出加 1 秒后的新时间

题目描述
输入一个时间,时间格式为:小时:分:秒,要求加一秒后,输出新的时间。
输入描述
输入数据含 3 个整数,分别表示小时、分、秒。数据之间用“:”分隔
输出描述
在一行上输出加 1 秒后的新时间。每个数据占 2 位,不足 2 位,在数据左边补 0。
输入样例
样例输入 1
5:38:59
样例输入 2
23:59:59
输出样例
样例输出 1
05:39:00
样例输出 2
00:00:00
#include <stdio.h>
int main()
{
    int h, m, s;
    scanf("%d:%d:%d", &h, &m, &s);
    s = s + 1;
    if (s == 60)
    {
        m++;
        s = 0;
    }
    if (m == 60)
    {
        h++;
        m = 0;
    }
    if (h == 24)
    {
        h = 0;
    }
    printf("%02d:%02d:%02d\n", h, m, s);
    return 0;
}

习题05(16)打印三角形

题目描述
打印三角形,输入 n 的值,输出对应形状的三角形
输入描述
输入一个整数 N(2<N<20)
输出描述
输出对应形状的三角形
输入样例
3
输出样例
//本行不输出,为注释
#include <stdio.h>
int main()
{
    int n, i, j;
    scanf("%d", &n);
    if (n > 2 && n < 20)
    {
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= n - i; j++)
            {
                printf(" ");
            }
            for (j = 1; j <= 2 * i - 1; j++)
            {
                printf("*");
            }
            printf("\n");
        }
    }
    return 0;
}

习题05(17)判断回文数字

题目描述
有这样一类数,它们顺着看和倒着看是相同的数,例如:121、656、2332 等,这样的数字
叫做回文数字。编写一个程序,判断从键盘输入的数字是否为回文数字。
提示:可能通过将一个十进制数“倒置”的办法来判断它是否是回文数字。所谓倒置,就是
计算该十进制数倒过来后的结果。如 123->321,因为 123 不等于 321,所以不是回文数;
121->121,倒置后相同,所以是回文数。
输入描述
一个十进制整数
输出描述
判断该数是否为回文数字的结果
输入样例
121
123
输出样例
121 是回文数
123 不是回文数
#include <stdio.h>
int main()
{
    int num, s, y = 0;
    scanf("%d", &num);
    s = num;
    while (s > 0)
    {
        y = y * 10 + s % 10;
        s = s / 10;
    }
    if (y == num)
    {
        printf("%d 是回文数\n", num);
    }
    else
    {
        printf("%d 不是回文数\n", num);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bmNkotc2AECynaY6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值