【C语言经典例题100解答】

文章目录


总结

未完~~,持续更新中,可收藏…

有错误,请指出;有疑问,请留言…

嗯,别忘了顺手帮我点个赞~~

多为中高级例题,小白请先研懂谭老师的书~~

前言

收纳整理C语言各类经典例题并给出实例代码和运行结果,力求代码最精简,供大家参考~~
开发及测试环境:Win11 + CLion(2024.1版)/ Win7 + VC6.0

例题1、求sn=a+aa+aaa+…的值,其中a是一个数字。例如:2+22+222+2222+22222(此时n=5),a和n由键盘输入。

#include <stdio.h>
 
void main() {
	int a; //数字
	int n; //长度
	int i;
	int sum = 0; //sn的值,初始化为0
	int temp;  //保存a或aa、aaa等的值
 
	printf("请输入一个1~9的数字:");
	scanf("%d",&a);
	printf("请输入长度:");
	scanf("%d",&n);
 
	temp = a;
	for(i = 0; i < n; i++) {
		sum += a;
		printf(" %d +",a);
		a = a*10 + temp;
	}
	printf("\b= %d\n",sum); // \b用来回退一格
}

运行结果:
在这里插入图片描述

例题2、打印出所有的“水仙花数“。所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如:153是一水仙花数,因为153=13+53+33

#include <stdio.h>

void main() {
    int i;
    int a, b, c;  //分别代表这个三位数的百位、十位、个位
    for (i = 100; i < 1000; i++) {
        a = i / 100;
        b = i % 100 / 10;
        c = i % 10;
        if (i == a * a * a + b * b * b + c * c * c) {
            printf("%d是水仙花数;\n", i);
        }
    }
}

运行结果:
在这里插入图片描述

例题3、一个数如果恰好等于它的因子之和,这个数就称为“完数”。 例如6=1+2+3。编程找出1000以内的所有完数。

#include <stdio.h>

void main() {
    int x;  //从2到1000的自然数
    int i;
    int sum = 0;
    for (x = 2; x < 1000; x++) {
        for (i = 1; i < x; i++) {
            if (x % i == 0)  //找出x的因子,是因子就累加
            {
                sum += i;
            }
        }
        if (x == sum)  //因数和与这个自然数x是否相等,是则输出
        {
            printf("%d\n", x);
        }
        sum = 0;   //将因数和复原到0,以便下次使用
    }
}

运行结果:
在这里插入图片描述

例题4、求解3X3矩阵对角线元素之和

#include<stdio.h>

void main() {
    int i;
    int sum = 0;
    int a[3][3] = {1, 2, 3,
                   2, 2, 3,
                   3, 2, 3};

    for (i = 0; i < 3; i++) {
        sum += a[i][i] + a[i][2 - i];
    }
    printf("对角线元素之和为%d\n", sum);
}

运行结果:
在这里插入图片描述

例题5、中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

#include <stdio.h>

void main() {
//方法一
    int x, y, z; //公鸡、母鸡、鸡崽各花掉的钱数

    printf("方法一计算结果:\n");
    for (x = 0; x <= 100; x += 5) //买公鸡的钱要能被5整除
        for (y = 0; y <= 100; y += 3) //买母鸡的钱要能被3整除
            for (z = 0; z <= 33; z++) //花33块钱买鸡崽足够了
                if (x + y + z == 100 && x / 5 + y / 3 + 3 * z == 100)
                    printf("公鸡%d只,母鸡%d只,鸡雏%d只\n", x / 5, y / 3, 3 * z);

//方法二
    int a, b, c; //公鸡、母鸡、鸡崽数量

    printf("方法二计算结果:\n");
    for (a = 0; a <= 20; a++)
        for (b = 0; b <= 33; b++)
            for (c = 0; c <= 100; c += 3)
                if (a + b + c == 100 && a * 5 + b * 3 + c / 3 == 100)
                    printf("公鸡%d只,母鸡%d只,鸡雏%d只\n", a, b, c);
}

运行结果:
在这里插入图片描述

例题6、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第10天早上想再吃时,就只剩一个桃子了。求第一天共摘下多少个桃子

#include <stdio.h>

void main() {
    int i;
    int s = 1;  //第10天的桃子数
    for (i = 0; i < 9; i++)  //每次循环,都是其前一天的桃子数
    {
        s = (s + 1) * 2;
    }
    printf("猴子第一天共摘下%d颗桃子\n", s);
}

运行结果:
在这里插入图片描述

例题7、一个球从100M高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时,共经过多少米?第10次反弹有多高?

#include <stdio.h>

void main() {
    int i;
    double s = 100; //第一次落地时经过的总长
    double h = 100; //第一次落地前的高度
    for (i = 0; i < 14; i++) {
        s = s + h;
        h = h / 2;
    }
    printf("10次落地共经过%f米\n第10次反弹高度是%f米\n", s, h / 2);
}

运行结果:
在这里插入图片描述

例题8、求出所有的4位数,符合abcd=(ab+cd)的平方

#include <stdio.h>

void main() {
    int i;
    int a;

    printf("符合abcd=(ab+cd)的平方的数字有:\n");
    for (i = 1000; i < 10000; i++) {
        a = i / 100 + i % 100;  // i/100取得ab值,i%100取得cd值
        if (a * a == i)
            printf("%d\n", i);
    }
}

运行结果:
在这里插入图片描述

例题9、从键盘上输入一个正整数,将其以二进制形式输出

#include <stdio.h>

void main() {
    int x;    //接收输入的整数
    int k = 0;    //数组中定位
    int a[32];    //这里最多能显示32位以内的整数

    printf("请输入一个正整数: ");
    scanf("%d", &x);      //这里没有对错误输入进行判断
    printf("\n%d的二进制形式是:", x);

    while (x != 0)     //利用二进制的辗转相除法
    {
        a[k++] = x % 2;
        x /= 2;
    }
    while (k != 0)   //将存于数组中的二进制数倒序输出
    {
        k--;
        printf("%d", a[k]);
    }
}

运行结果:
在这里插入图片描述

例题10、歌德巴赫猜想。每个不小于6的偶数都可以表示为两个奇素数之和;例如:5=2+3 , 8=3+5 ,验证100以内的自然数

#include<stdio.h>

void main() {
    int a, b, i, j, m;
    int n = 0;

    for (m = 6; m <= 100; m++)   //m是大于等于6的自然数
    {
        for (a = 2; a <= m / 2; a++) {
            b = m - a;
            for (i = 2; i <= a; i++)     //求解第一个奇素数
                if (a % i == 0)     //如果能够整除,则其不是素数
                    break;
            for (j = 2; j <= b; j++)      //求解第二个奇素数
                if (b % j == 0)
                    break;
            if (i == a && j == b)  //当a、b都是素数的时候,并且前面已经确定了m=a+b
            {
                printf("%2d=%2d+%2d  ", m, a, b);
                if (++n % 6 == 0)   //每输出6次换行,删除此代码,系统自动换行
                    printf("\n");
                break;
            }
        }
    }
}

运行结果:
在这里插入图片描述

例题11、写一函数,打印出输入的两个数中最大值,输出过程在main函数内实现

#include <stdio.h>

int max(int a, int b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

void main() {
    int x, y;
    printf("请连续输入两个整数\n");
    scanf("%d %d", &x, &y);
    printf("答:%d和%d的最大值是:%d\n", x, y, max(x, y));
}

运行结果:
在这里插入图片描述

例题12、矩阵反置,例如将左面的矩阵变换成右面的矩阵模样

1 2 3-----------1 4 7
4 5 6-----------2 5 8
7 8 9-----------3 6 9

#include <stdio.h>

void main() {
    int a[3][3] = {1, 2, 3,
                   4, 5, 6,
                   7, 8, 9};
    int i, j, x; //x为第三方变量,起到交换值的作用

    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            if (j >= i) //为什么要j>=i呢?仔细看图,例如 2的位置是a[0][1],4的位置是a[1][0]
            {
                x = a[i][j];
                a[i][j] = a[j][i];
                a[j][i] = x;
            }
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

例题13、输入分数,按分数输出成绩等级 A B C D E

90分以上为A
80-89分为B
70-79分为C
60-69分为D
60分以下为E

#include <stdio.h>

void main() {

    int a;
    printf("请输入分数:");
    scanf("%d", &a);

    if (a >= 90 && a <= 100) {
        printf("您的成绩是A\n");
    } else if (a >= 80 && a <= 89) {
        printf("您的成绩是B\n");
    } else if (a >= 70 && a <= 79) {
        printf("您的成绩是C\n");
    } else if (a >= 60 && a <= 69) {
        printf("您的成绩是D\n");
    } else if (a >= 0 && a < 60) {
        printf("您的成绩是E\n");
    } else {
        printf("您的输入有问题,请仔细检查\n");
    }
}

运行结果:
在这里插入图片描述

例题14、求前100个质数(不是100以内质数)

#include <stdio.h>

void main() {
    int i;
    int x = 2;  //自然数
    int sum = 0;  //质数的数量

    while (sum < 100) {
        for (i = 2; i < x; i++)  // 如果这个数能被2到X-1整除开的话,这个数就不是质数
        {
            if (x % i == 0)   //如果能除开,就没有继续算下去的必要了
            {
                break;   //所以就可以跳出来了
            }
        }
        if (x == i)    //什么时候x才能和i相等呢? 只有上面x%i==0不成立的情况下才会发生
        {
            sum++;   //每次得到一个质数,就把计数器加上一个
            printf("%d\t", x);
            if (sum % 10 == 0)  //每10个质数分一行,便于观察
            {
                printf("\n");
            }
        }
        x++;   //别忘了这里,自然数是要自然增长的
    }
}

运行结果:
在这里插入图片描述

例题15、求前100以内的质数,用数组完成。求解思想:数学上规定,如果一个数不能被小于它的所有质数整除开的话,则这个数也一定是质数

#include <stdio.h>

void main() {
    int a[100] = {2};   //存放已知质数的数组
    int i;
    int j;
    int p = 1; //数组中目前有多少个质数

    printf("百以内的质数有:\n");
    for (i = 3; i < 101; i++) {
        for (j = 0; j < p; j++)
            if (i % a[j] == 0)
                break;
        if (j == p) {
            printf("%d ", a[p - 1]);
            a[p++] = i;
        }
    }
}

运行结果:
在这里插入图片描述

例题16、二维数组实现杨辉三角

#include <stdio.h>

void main() {
    int i, j;
    int a[10][10] = {1};  //在这里,最多显示到第10行
    for (i = 0; i < 10; i++) {
        a[i][0] = 1;
        for (j = 0; j <= i; j++) {
            printf("%5d ", a[i][j]);
            if (i != 9)
                a[i + 1][j + 1] = a[i][j] + a[i][j + 1];
        }
    }
}

运行结果:
在这里插入图片描述

例题17、写一函数,实现两字符串的连接

#include <stdio.h>
#include <string.h>

void cat(char a[], char b[]) {
    int i, j, k;
    i = strlen(a);
    j = strlen(b);

    for (k = 0; k < j; k++) {
        a[i++] = b[k];
    }

    a[i] = '\0';
    puts(a);
}

void main() {
    char a[100];
    char b[100];

    printf("输入第一个字符串:");
    gets(a);
    printf("输入第二个字符串:");
    gets(b);
    printf("字符串连接后:");
    cat(a, b);
}

运行结果:
在这里插入图片描述

例题18、定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天?注意闰年问题

要求:写一个函数days,实现其功能。由主函数将年、月、日传递给days函数。计算后将日子数
传回主函数输出

#include <stdio.h>

struct d {
    int year;
    int month;
    int day;
    int sum;
};

int days() {
    struct d a;
    int i;
    a.sum = 0;
    int day_of_month[12] = {31, 28, 31,
                            30, 31, 30,
                            31, 31, 30,
                            31, 30, 31};

    printf("输入年月日,形式为XXXX-XX-XX\n");
    scanf("%d-%d-%d", &a.year, &a.month, &a.day);

    if (a.year % 4 == 0 && a.year % 100 != 0 || a.year % 400 == 0)
        day_of_month[1] = 29;
    for (i = 0; i < a.month - 1; i++) {
        a.sum += day_of_month[i];
    }

    a.sum += a.day;
    printf("%d年%d月%d日", a.year, a.month, a.day);
    return a.sum;
}

void main() {
    printf("是这一年的第%d天\n", days());
}

运行结果:
在这里插入图片描述

例题19、编写一个函数,打印学生成绩,该数组中有3个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,输入学号,将该学号的学生记录输出

#include <stdio.h>

struct student {
    int num;
    char name[10];  //放学生的姓名
    int score[3];  //可用来存放三门科目的成绩
} stu[3];

void main() {
    int i, j, x;
    for (i = 0; i < 3; i++) {
        printf("\n");
        printf("输入学生的学号:");
        scanf("%d", &stu[i].num);
        printf("输入学生的姓名:");
        scanf("%s", stu[i].name);
        printf("输入学生数、理、化成绩:");
        for (j = 0; j < 3; j++) {
            scanf("%d", &stu[i].score[j]);
        }
    }
    printf("输入学生学号,以输出其三门课程成绩:");
    scanf("%d", &x);
    printf("学号  姓名  数学  物理  化学\n");
    for (i = 0; i < 3; i++) {
        if (stu[i].num == x) {
            printf("%d  %s  %d  %d  %d\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
            break;
        }
    }
}

运行结果:
在这里插入图片描述

例题20、输入3个数,按由大到小的顺序输出

#include <stdio.h>

void main() {
    int a, b, c;
    printf("请输入三个数:");
    scanf("%d%d%d", &a, &b, &c);

    //第一种方法:推理法
    if (a >= b) {
        if (b >= c)
            printf("%d,%d,%d\nn", a, b, c);
        else {
            if (a >= c)
                printf("%d,%d,%d\n", a, c, b);
            else
                printf("%d,%d,%d\n", c, a, b);
        }
    } else  //隐含着表示了a<b的情况
    {
        if (b <= c)
            printf("%d,%d,%d\n", c, b, a);
        else {
            if (a >= c)
                printf("%d,%d,%d\n", b, a, c);
            else
                printf("%d,%d,%d\n", b, c, a);
        }
    }
    /*  第二种方法:列举法
    if (a >= b && b >= c) {
        printf("%d,%d,%d\n", a, b, c);
    } else if (a >= c && c >= b) {
        printf("%d,%d,%d\n", a, c, b);
    } else if (b >= a && a >= c) {
        printf("%d,%d,%d\n", b, a, c);
    } else if (b >= c && c >= a) {
        printf("%d,%d,%d\n", b, c, a);
    } else if (c >= a && a >= b) {
        printf("%d,%d,%d\n", c, a, b);
    } else if (c >= b && b >= a) {
        printf("%d,%d,%d\n", c, b, a);
    }
    */
}

运行结果:
在这里插入图片描述

例题21、求 2/1+3/2+5/3+8/5+… 的前20项的和

#include <stdio.h>

void main() {
    int i;
    double a = 1;
    double b = 2;
    double sum = 0;
    double t;

    for (i = 0; i < 20; i++) {
        sum += b / a;
        t = a + b;
        a = b;
        b = t;
    }
    printf("2/1+3/2+5/3+8/5+...  的前20项的和为:%f\n", sum);
}

运行结果:
在这里插入图片描述

例题22、用指针方式实现strlen函数的功能

#include <stdio.h>

int mystrlen(char *p);

void main() {
    char ch[10];
    printf("输入字符串的内容:");
    gets(ch);
    printf("字符串的有效长度是:%d\n", mystrlen(ch));
}

int mystrlen(char *p) {
    int len = 0;
    while (*(p + len) != '\0') {
        len++;
    }
    return len;
}

运行结果:
在这里插入图片描述

例题23、输入两个数,求其最大公约和最小公倍数

#include <stdio.h>

void main() {
    int m, n, x, y;

    printf("输入两个正整数:");
    scanf("%d%d", &m, &n);

    if (m < n)        //在m中存放m、n中最大者
    {
        x = m;
        m = n;
        n = x;
    }

    printf("%d和%d的", m, n);
    y = m * n;    //将m、n的值作个备份
    while (x != 0)  //辗转相除法
    {
        x = m % n;
        m = n;
        n = x;
    }
    printf("最大公约数是%d\n最小公倍数是%d\n", m, y / m);
}

运行结果:
在这里插入图片描述

例题24、给一个不超过5位的正整数,要求:

  1. 求出它是几位数
  2. 按逆序输出各位数字,例如输入12345,则输出54321
#include <stdio.h>

void main() {
    int x;
    int a, b, c, d, e;
    int y;

    printf("请输入一个不超过5位的正整数:");
    scanf("%d", &x);
    a = x / 10000;
    b = x % 10000 / 1000;
    c = x % 1000 / 100;
    d = x % 100 / 10;
    e = x % 10;

    if (a > 0)
        printf("这是一个5位数\n");
    else if (b > 0)
        printf("这是一个4位数\n");
    else if (c > 0)
        printf("这是一个3位数\n");
    else if (d > 0)
        printf("这是一个2位数\n");
    else
        printf("这是一个个位数\n");

    y = e * 10000 + d * 1000 + c * 100 + b * 10 + a;
    while (y % 10 == 0)
        y = y / 10;
    printf("逆序输出为:%d\n", y);
}

运行结果:
在这里插入图片描述

例题25、一维数组实现杨辉三角

#include <stdio.h>

void main() {
    int i, j, x; //x,y是二个计数器,X是欲显示的行数

    printf("输入杨辉三角行数:");
    scanf("%d", &x);

    int a[20] = {1};
    int b[20] = {1};

    for (i = 0; i < x; i++) {
        for (j = 0; j <= i; j++) {
            printf("%4d ", a[j]); //A数组是真正显示的数组
            b[j + 1] = a[j] + a[j + 1]; //B数组是通过A数组计算出来的,其实也就是要显示的下一行的内容
            a[j] = b[j]; //将数组B的内容重新拷回到数组A中,因为我们要显示的是A,而不是B
        }
        a[j] = 1; //数组末尾封1结束
        printf("\n"); //换行
    }
}

运行结果:
在这里插入图片描述

例题26、有 1、2、3、4 四个数字,组成互不相同且无重复数字的三位数都是多少?总数是多少个?

#include <stdio.h>

void main() {
    int i, j, k; // 个、十、百位
    int sum = 0;

    for (i = 1; i < 5; i++) {
        for (j = 1; j < 5; j++) {
            for (k = 1; k < 5; k++) {
                if (i == j || j == k || i == k) { //去掉所有数字重复的
                    continue;
                }
                printf("%d\t", i * 100 + j * 10 + k);
                sum++;
            }
        }
    }
    printf("\n不重复的三位数共计:%d个\n", sum);
}

运行结果:
在这里插入图片描述

例题27、打印99乘法口诀表

#include <stdio.h>

void main() {
    int i, j;
    int result = 0;

    for (i = 1; i < 10; i++) {
        for (j = 1; j <= i; j++) {
            result = i * j;
            printf("%d*%d=%d\t", j, i, result);
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

例题28、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假设兔子都不死,问每个月的兔子总数为多少?(输出前40个月)

解题思路:每个月是上两个月之和(从第三个月开始),兔子的规律为1,1,2,3,5,8,13,21…,此即著名的“斐波那契数列”,也被称为“黄金分割数列”

#include <stdio.h>

void main() {
    int i, f1, f2;  //f1,f2为斐波那契数列前两项
    i = f1 = f2 = 1;

    for (; i <= 20; i++) { //每次打印f1,f2两项,所以循环次数40/2=20
        printf("%10d%10d", f1, f2);
        if (i % 4 == 0) //每打印8项,换行
            printf("\n");
        f1 += f2;
        f2 += f1;
    }
}

运行结果:
在这里插入图片描述

例题29、在屏幕上显示一个等腰三角形

#include <stdio.h>

void main() {
    int i, j;
    int x;

    printf("输入等腰三角形行数:");
    scanf("%d", &x);

    for (i = 1; i <= x; i++) {
        for (j = i; j < x; j++) {
            printf(" "); //输出空格占位
        }
        for (j = 1; j < 2 * i; j++) {
            printf("*");
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

例题30、将一个正整数分解质因数,例如100=225*5

#include <stdio.h>

void main() {
    int i;
    int x;

    printf("请输入一个正整数:");
    scanf("%d", &x);
    printf("%d = ", x);

//方法一:
    for (i = 2; i <= x; i++) { //除数,从质数2开始
        while (x % i == 0) {   //能够被质数整除
            printf(" %d ", i);
            x = x / i;
            if (x != 1) {
                printf("*");
            }
        }
    }

//方法二:
//    for (i = 2; i < x; i++) { //除数,从质数2开始
//        if (x % i == 0) {     //能够被质数整除
//            x = x / i;
//            printf("%d * ", i);//输出该质数
//            i = 1;       //重置除数:重新从质数2开始
//        }
//    }
//    if (x != 1) {
//        printf("%d", x); //输出最后的质数
//    }
}

在这里插入图片描述

例题31、在屏幕上显示一个菱形

#include <stdio.h>

void main() {
    int i, j;
    int x;

    printf("输入菱形行数(3以上的奇数):");
    scanf("%d", &x);

    //显示菱形上面的大三角形
    for (i = 1; i <= (x + 1) / 2; i++) {
        for (j = i; j < (x + 1) / 2; j++) {
            printf(" "); //输出空格占位
        }
        for (j = 1; j < 2 * i; j++) {
            printf("*");
        }
        printf("\n");
    }
    //显示菱形下的小三角形
    for (i = 1; i <= (x - 1) / 2; i++) {
        for (j = 1; j <= i; j++) {
            printf(" ");
        }
        for (j = i; j < x - i; j++) {
            printf("*");
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

例题32、求1!+2!+3!+…+N!的和(自己编写计算N!阶乘的函数)

#include <stdio.h>

double factorial(int num) {
    double result = 1;
    for (int i = 2; i <= num; i++) {
        result *= i;
    }
    return result;
}

void main() {
    int x;
    double sum = 0;

    printf("请输入阶乘的值:");
    scanf("%d", &x);

    for (int i = 1; i <= x; i++) {
        sum += factorial(i);
    }
    printf("阶乘的和为:%.f", sum);
}

在这里插入图片描述

例题33、求1!+2!+3!+…+N!的和(递归函数实现)

#include <stdio.h>

//递归计算阶乘的函数
double factorial(int num) {
    double result;
    if (num == 0) {
        result = 1;
    } else {
        result = num * factorial(num - 1);
    }
    return result;
}

void main() {
    int x;
    double fac;//N!的阶乘值
    double sum = 0;//阶乘的和

    printf("请输入1-N阶乘的值:");
    scanf("%d", &x);

    for (int i = 1; i <= x; i++) {
        fac = factorial(i);
        printf("%d!=%.f\n", i, fac);
        sum += fac;
    }
    printf("阶乘的和为:%.f", sum);
}

运行结果:
在这里插入图片描述

例题34、反向输出字符串(递归方式),例如:输入abcde,输出edcba

#include <stdio.h>

void reverse(int num) {
    char cur_char;
    if (num == 1) {
        cur_char = getchar();
        printf("逆序输出为:");
        putchar(cur_char);
    } else {
        cur_char = getchar();
        reverse(num - 1);
        putchar(cur_char);
    }
}

int main() {
    int i = 5;
    printf("请输入5个字符:");
    reverse(i);
}

运行结果:
在这里插入图片描述

例题35、反向输出字符串(指针方式),例如:输入abcde,输出edcba

#include <stdio.h>

void reverse(char *p) {
    int len = 0;

    while (*p != '\0') {  //取得字符串长度
        p++;
        len++;
    }

    while (len > 0) {  //反向打印到终端
        printf("%c", *--p);
        len--;
    }
}

int main() {
    char s[255];

    printf("请输入一个字符串:");
    gets(s);

    reverse(s);
}

运行结果:
在这里插入图片描述

例题36、判断一个数是否是回文数,例如12321就是回文数

#include <stdio.h>

int main() {
    int x;
    int ge, shi, qian, wan;

    printf("请输入一个5位数:");
    scanf("%d", &x);

    ge = x % 10;              //个
    shi = x % 100 / 10;       //十
    qian = x % 10000 / 1000;  //千
    wan = x / 10000;          //万

    if (ge == wan && shi == qian) {
        printf("%d是回文数\n", x);
    } else {
        printf("%d不是回文数\n", x);
    }
}

运行结果:
在这里插入图片描述

例题37、输入三组数字,按照从小到大的顺序排列输出

#include<stdio.h>

int main() {
    int num[3];

    printf("请输入3组数字:");
    for (int i = 0; i < 3; i++)
        scanf("%d", &num[i]);

    for (int i = 0; i < 2; i++) {  //每次选出最小值依次放在数组前面
        for (int j = i + 1; j < 3; j++) {
            if (num[j] < num[i]) {
                int tmp = num[j]; //通过中间变量,将min和max交换位置
                num[j] = num[i];
                num[i] = tmp;
            }
        }
    }
    for (int i = 0; i < 3; i++)
        printf("%d ", num[i]);
}

运行结果:
在这里插入图片描述

例题38、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,最后留下来的是原来第几号人员?

#include <stdio.h>
#define MAX_CALLER 3

void main() {
    int j = 0;
    int p_total;//人数
    int p_caller = 0;//每3人循环计数:1,2,3
    int p_exit = 0;  //退出游戏的人数
    int people[255] = {0};//参与游戏人员名单

    printf("请输入参与游戏人数:");
    scanf("%d", &p_total);

    for (int i = 0; i < p_total; i++) {
        people[i] = i + 1;//给参与游戏人员按顺序进行编号
    }

    while (p_exit < p_total - 1) {//轮数:因为每次退出一人,则N-1轮淘汰即可完成
        p_caller++;//报数:1,2,3

        if (people[j] == 0) {//如果当前位置已经退出
            p_caller--;//报数回退一个
        }

        if (people[j] != 0 && p_caller == MAX_CALLER) {//如果数到3还未退出者
            people[j] = 0;//标记为退出状态
            p_caller = 0; //重新报数
            p_exit++;
        }

        if (j == p_total - 1)
            j = 0; //如果数到队尾,重新回到队伍排头
        else
            j++; //队列依次向后轮转
    }

    for (int k = 0; k < p_total; k++) {
        if (people[k] != 0)
            printf("第%d位游戏者,胜出\n", people[k]);
    }
}

运行结果:
在这里插入图片描述

例题39、输入一个正整数,将其反方向逆序输出

#include <stdio.h>

void main() {
    int x;
    int ge; //个位
    int result = 0;

    printf("请输入一个正整数:");
    scanf("%d", &x);

    while (x > 0) {//解题原理
        ge = x % 10;//每次分解取得个位的数字
        result = result * 10 + ge;//个十百千万顺序向左移动,即放大10倍
        x = (x - ge) / 10;//砍掉个位
    }
    printf("逆序输出为:%d", result);
}

运行结果:
在这里插入图片描述

例题40、海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

#include<stdio.h>

void main() {
    int i;
    int j = 1;//倍数
    int x;//第5个猴子扔掉一个并取走一份后,剩余4份的总数量

    while (1 == 1) {//干就完了
        x = 4 * j++;//海滩上剩余桃子总数,必须是4的倍数(用4的倍数进行穷举)

        for (i = 1; i <= 5; i++) {
            x = x * 5 / 4 + 1;//第一次循环为第5个猴子动手前海滩上的桃子总数,以后依次为第4猴,第三猴...
            if (x % 4 == 0) {//海滩上剩余桃子总数依然必须是4的倍数(能够分成4份)
                continue;
            } else {
                break;
            }
        }
        if (i == 5) {//5个猴子都完成了各自操作
            break;
        }
    }
    printf("海滩上原来最少有%d个桃子\n", x);
}

运行结果:
在这里插入图片描述

例题41、八进制转换为十进制

#include<stdio.h>

void main() {
    int x;

    printf("请输入一个8进制整数:");
    scanf("%o", &x);

    printf("转换成十进制后的整数为%d\n", x);
}

运行结果:
在这里插入图片描述

例题42、打印金字塔

#include <stdio.h>

void main() {
    int i, j;

    for (i = 0; i < 5; i++) {
        for (j = 4; j > i; j--) {//输出空格
            printf("  ");
        }
        for (j = 0; j < 2 * i + 1; j++) {//输出星号
            printf("* ");
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

例题43、打印倒金字塔

#include <stdio.h>

void main() {
    int i, j;

    for (i = 5; i > 0; i--) {
        for (j = 5; j > i; j--) {//输出空格
            printf("  ");
        }
        for (j = 2 * i; j > 1; j--) {//输出星号
            printf("* ");
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

例题44、输出楼梯图形

#include <stdio.h>

void main() {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j <= 5 * i; j++) {//楼梯长度,可随意调整
            printf("%c%c", 0xa8, 0x80);//终端不支持显示这两个字符的字体,白色方块,不用纠结
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

例题45、一个偶数总能表示为两个素数之和

注意:1和0既非素数也非合数

#include <stdio.h>

int isPrime(int n) {//判断n是否为质数
    if (n < 2) {
        return 0;
    }
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

void main() {
    int x;

    printf("请输入一个大于2的偶数:");
    scanf("%d", &x);

    for (int i = 1; i < x; i++) {
        if (isPrime(i) && isPrime(x - i)) {//如果拆分出来的2个数都是质数
            printf("%d = %d + %d", x, i, x - i);//打印输出
            break;//果断走人
        }
    }
}

运行结果:
在这里插入图片描述

例题46、根据公式π/4=1-1/3+1/5-1/7+1/9-1/11+…,计算π的近似值,当最后一项的绝对值小于0.000001为止

#include <stdio.h>
#include <math.h>

int main() {
    int fm = 1;//分母
    double sign = 1;//正负号
    double fzs = 1;//分子式
    double sum = 0;

    while (fabs(fzs) >= 0.000001) {
        sum += fzs;
        sign *= -1; //变换正负号
        fm += 2;     //分母3、5、7、9...增长
        fzs = sign / fm;//分子式
    }
    printf("π的近似值为%.5lf\n", sum * 4);
}

运行结果:
在这里插入图片描述

例题47、从键盘输入一个正整数n,计算1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n) 的值

#include <stdio.h>

void main() {
    int x;
    int fm = 0;//分母
    double sum = 0;

    printf("请输入一个正整数:");
    scanf("%d", &x);

    for (int i = 1; i <= x; i++) {
        fm += i;//分母变化
        sum = sum + 1.0 / fm;

        if (i != x) {
            printf("1/%d + ", fm);
        } else {
            printf("1/%d = ", fm);
        }
    }
    printf("%lf", sum);
}

运行结果:
在这里插入图片描述

例题48、打印沙漏图案

解题思路:沙漏本身是轴对称图形,以沙漏最左上角为起点,利用行列与对称轴的距离差判定打印星号和空格

#include <stdio.h>
#include <math.h>

void main() {
    int x, y;

    printf("请输入沙漏行数(奇数):");
    scanf("%d", &x);

    y = (x + 1) / 2;//对称轴位置点

    for (int i = 1; i <= x; i++)//行
    {
        for (int j = 1; j <= x; j++)//列
        {
            if (abs(i - y) >= abs(j - y))//行与列距离对称轴的距离差
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
}

运行结果:
在这里插入图片描述

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值