网易首页 > 网易号 > 正文 申请入驻

C语言基础程序——入门经典100道实例

0
分享至

专栏:50多种数据结构彻底征服

专栏:50多种经典图论算法全部掌握

001, 组无重复数字的数

题目:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?

问题分析:先在百位数选择一个数字,接着在十位上选择一个数字,最后在个位上选择一个数字,但要保证每次选择的三个数字都互不相同,使用三个for循环即可找出这样的数字。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include // 标准的输入输出头文件

int main() {
for (int i = 1; i < 5; i++) { // 先选择百位上的数字
for (int j = 1; j < 5; j++) {// 接着选择十位上的数字
for (int k = 1; k < 5; k++) { // 最后选择个位上的数字
// 选择的三个数字必须都互不相同
if (i != j && i != k && j != k) {
printf("%d%d%d\n", i, j, k);
}
}
}
}
return 0;
}

优化:上面代码中也可以在for循环的时候判断是否有重复的数字,如果有,则直接跳过。

运行结果:

123
124
132
134
142
143
213
214
231
234
241
243
312
314
321
324
341
342
412
413
421
423
431
432

002,企业发放的奖金根据利润提成

  • 利润 i 低于或等于10万元时,奖金可提10%;

  • 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;

  • 20万到40万之间时,高于20万元的部分,可提成5%;

  • 40万到60万之间时高于40万元的部分,可提成3%;

  • 60万到100万之间时,高于60万元的部分,可提成1.5%;

  • 高于100万元时,超过100万元的部分按1%提成。

从键盘输入当月利润 i ,求应发放奖金总数?

问题分析:根据利润的区间,让数字在不同的区间分别单独计算。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
double i;// 利润
double bonus = 0;// 奖金
printf("当月利润是:");
scanf("%lf", &i);// 输入当月利润
double bonus1 = 100000 * 0.1;// 十万的奖金
double bonus2 = bonus1 + 100000 * 0.075;// 二十万的奖金
double bonus4 = bonus2 + 200000 * 0.05;// 四十万的奖金
double bonus6 = bonus4 + 200000 * 0.03;// 六十万的奖金
double bonus10 = bonus6 + 400000 * 0.015;// 一百万的奖金
if (i <= 100000) {
// 利润 i 低于或等于10万元时,奖金可提10%;
bonus = i * 0.1;
} else if (i <= 200000) {
// 低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
bonus = bonus1 + (i - 100000) * 0.075;
} else if (i <= 400000) {
// 20万到40万之间时,高于20万元的部分,可提成5%;
bonus = bonus2 + (i - 200000) * 0.05;
} else if (i <= 600000) {
// 40万到60万之间时高于40万元的部分,可提成3%;
bonus = bonus4 + (i - 400000) * 0.03;
} else if (i <= 1000000) {
// 60万到100万之间时,高于60万元的部分,可提成1.5%;
bonus = bonus6 + (i - 600000) * 0.015;
} else if (i > 1000000) {
// 高于100万元时,超过100万元的部分按1%提成。
bonus = bonus10 + (i - 1000000) * 0.01;
}
printf("应发奖金为:bonus=%lf", bonus);
return 0;
}

运行结果:

当月利润是:350000
应发奖金为:bonus=25000.000000

003,完全平方数

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

问题分析:

假设该数为 x。

1、则 x + 100 = m,x + 100 + 168 = n,其中 m 和 n 都是完全平方数。

2、设 n = a2,m = b2,则 n - m = (a + b)(a - b) = 168,因为a+b和a-b具有相同的奇偶性,又因为168是偶数,所以a+b和a-b都是偶数。

3、设 a+b=2*i,a-b=2*j;可得 i * j = 168/4=42。

4、接下来只需要枚举 i 从 1 到 42 即可,根据上面的公式我们也可以得出 a = i + j,b = i - j,进一步又可以得出 m ,n 以及 x 的值。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
// 枚举 i 从 1 到 42 。
for (int i = 1; i <= 42; i++) {
if (42 % i == 0) { // 要满足i*j=42
int j = 42 / i; // 计算 j 的值。
if (i > j) {
// 根据 i 和 j 可以计算 a ,b 以及 x 的值。
int a = i + j;
int b = i - j;
int x = b * b - 100;
printf("%d + 100 = %d * %d\n", x, b, b);
printf("%d + 268 = %d * %d\n", x, a, a);
}
}
}
return 0;
}

运行结果:

-99 + 100 = 1 * 1
-99 + 268 = 13 * 13
21 + 100 = 11 * 11
21 + 268 = 17 * 17
261 + 100 = 19 * 19
261 + 268 = 23 * 23
1581 + 100 = 41 * 41
1581 + 268 = 43 * 43

004,判断当天是这一年的第几天

题目:输入某年某月某日,判断这一天是这一年的第几天?

问题分析:先计算当月之前的总天数,然后再加上当月的天数。比如10月16号,先计算9月(包含9月)之前的总天数,然后加上10月的16天,最后在判断是否是闰年,如果是闰年并且输入的月份大于 2 ,要多加一天。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
// 每月的天数,其中2月先暂定为28天。
const int daysInMonth[] = {31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};

int day, month, year, total;
printf("请输入年月日,格式为:年,月,日(2024,10,16)\n");
scanf("%d,%d,%d", &year, &month, &day); // 格式为:2024,10,16
total = 0; // 计算输入月份之前的总天数
for (int i = 0; i < month - 1; i++)
total += daysInMonth[i];

total += day;// 加上当月的天数
// 判断是否为闰年
int leap = (year % 400 == 0) ||
(year % 4 == 0 && year % 100 != 0);
// 如果是闰年且月份大于2, 总天数加一天
if (leap && month > 2)
total++;
printf("这是这一年的第 %d 天。", total);
return 0;
}

运行结果:

请输入年月日,格式为:年,月,日(2024,10,16)
2024,10,16
这是这一年的第 290 天。

005,三个数由小到大输出

题目:输入三个整数 x、y、z,请把这三个数由小到大输出。

问题分析:先用 x 和 y ,z 比较,只要比它俩小就交换,这样就可以保证 x 是这三个数中最小的。然后用 y 和 z 比较,把最大值保存在 z 中,这样 x、y、z 就是从小到大的了。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

// 交换两个变量的值
void swap(int *a, int *b) {
int tmp = *a;// 需要临时变量
*a = *b;
*b = tmp;
}

int main() {
int x, y, z;
printf("请输入三个数字:\n");
scanf("%d,%d,%d", &x, &y, &z);// 注意输入的时候用逗号隔开
// 两两比较,前两个if可以保证 x 最小,最后一个if可以保证 z 最大。
if (x > y)
swap(&x, &y);
if (x > z)
swap(&x, &z);
if (y > z)
swap(&y, &z);
printf("从小到大排序: %d %d %d\n", x, y, z);
return 0;
}

运行结果:

请输入三个数字:
3,7,6
从小到大排序: 3 6 7

006,输出字母C图案

题目:用 * 号输出字母C的图案。

问题分析:按照字母C的形状直接输出即可。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
printf("用 * 号输出字母 C!\n");
printf("****\n");
printf("*\n");
printf("* \n");
printf("****\n");
return 0;
}

运行结果:

用 * 号输出字母 C!
****
*
*
****

007,特殊图案

题目:输出特殊图案。

问题分析:不同字符,图形不一样。需要把编码格式改成437 OEM-美国,否则会出现乱码。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include
#include // 引用头文件

int main() {
SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
char a = 177, b = 223;// 随便两个数字
printf("%c%c%c%c%c\n", b, a, a, a, b);
printf("%c%c%c%c%c\n", a, b, a, b, a);
printf("%c%c%c%c%c\n", a, a, b, a, a);
printf("%c%c%c%c%c\n", a, b, a, b, a);
printf("%c%c%c%c%c\n", b, a, a, a, b);
return 0;
}

运行结果:

008,9*9 乘法表

题目:输出 9*9 口诀。

问题分析:使用两个for循环即可完成。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
for (int i = 1; i < 10; i++) {// 行
for (int j = 1; j <= i; j++) { // 列
// %-3d表示左对齐,占3位
printf("%d*%d=%-3d", j, i, i * j);
}
printf("\n"); // 换行
}
return 0;
}

运行结果:

1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

009,国际象棋棋盘

题目:要求输出国际象棋棋盘。

问题分析:国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。用 i 控制行, j 来控制列,根据 i+j 的和来控制输出黑方格,还是白方格。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include
#include // 引用头文件

int main() {
SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++)
if ((i + j) % 2 == 0)
printf("%c%c", 219, 219);// 白色
else
printf(" ");// 黑色
printf("\n");// 换行
}
return 0;
}

运行结果:

010,打印笑脸

题目:打印楼梯,同时在楼梯上方打印两个笑脸。

问题分析:用 ASCII 1 输出笑脸;用 i 和 j 来控制行和列,然后输出白色当做楼梯,要注意需要修改编码格式。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include
#include // 引用头文件

int main() {
SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
printf("\1\1\n"); // 打印两个笑脸
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++)
printf("%c%c", 219, 219);// 打印白色楼梯
printf("\n");// 换行
}
return 0;
}

运行结果:

011,兔子生崽

题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)

问题分析:兔子的规律为1,1,2,3,5,8,13,21....,即下个月是上两个月之和,这是一个典型的斐波那契数列。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
int a = 1, b = 1;// 前两项
printf("%12d%12d", a, b); // 输出前两项,%12d表示占12行,右对齐。
for (int i = 3; i <= 40; i++) {// 从第3项开始计算
int cur = a + b;// 当前月是上两个月之和
a = b;
b = cur;
printf("%12d", cur);// 打印当前月的值
if (i % 4 == 0)// 输入4个换行
printf("\n");
}
return 0;
}

运行结果:

1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040 1346269 2178309
3524578 5702887 9227465 14930352
24157817 39088169 63245986 102334155

012,101到200的素数

题目:判断 101 到 200 之间的素数。

问题分析:101 到 200之间的偶数不可能是素数,所以我们只需要判断奇数即可。对于每一个奇数,判断能不能被 2 到 sqrt(包含这个数)之间的数整除,如果能被整除,则表明此数不是素数,否则是素数。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include
#include
#include

// 判断101 到 200之间的奇数是否是素数。
bool isPrime(int num) {
int sq = (int) sqrt(num);// 计算平方根
for (int j = 2; j <= sq; j++) {
if (num % j == 0)// 如果能被 j 整除,则不是素数。
return false;
}
return true;
}

int main() {
int count = 0;// 统计素数的个数
printf("素数在 101 到 200 之间的列表:\n");
// 101 到 200之间的偶数不可能是素数,所以我们只需要判断奇数即可。
for (int i = 101; i <= 200; i += 2) {
if (isPrime(i)) { // 如果是素数,则打印
printf("%d ", i);
if (++count % 5 == 0)// 每 5 个换行
printf("\n");
}
}
return 0;
}

运行结果:

素数在 101 到 200 之间的列表:
101 103 107 109 113
127 131 137 139 149
151 157 163 167 173
179 181 191 193 197
199

013,水仙花数

题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1^3+5^3+3^3=1+125+27。

问题分析:对于100-999之间的每一个数,分别求出个位,十位,百位,然后计算它们的立方之和是否等于该数本身,如果等于,则是水仙花数,否则不是。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
int i, x, y, z;
for (i = 100; i < 1000; i++) {
x = i % 10;// 个位
y = i / 10 % 10;// 十位
z = i / 100;// 百位
if (i == x * x * x + y * y * y + z * z * z)
printf("%d\n", i);
}
return 0;
}

运行结果:

153
370
371
407

014,分解质因数

题目:将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。

问题分析:对于输入的整数n ,判断 2 到 n 之间哪些数能被它整除,如果能被正常,则一直除。比如 120 能被 2 整除,结果是 60 ,60 还能被 2 整除,结果是 30 ,30 还能被 2 整除,结果是 15,15不能被 2 整除,但 15 能被 3 正常,结果是 5 ,5 不能被 3 整除,但 5 能被 5 整除,结果是 1 ,退出循环。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
int n;
printf("请输入整数:");
scanf("%d", &n);// 输入需要分解的整数
printf("%d=", n);
// 遍历2到n之间的整数是否是n的质因数,注意这里个n是变动的
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
printf("%d", i);// 打印质因数
n /= i;// 改变n的值。
if (n != 1)
printf("*");
}
}
return 0;
}

运行结果:

请输入整数:120
120=2*2*2*3*5

015,(a>b)?a:b

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

问题分析:在三目运算符中 c ? a : b ,如果 c 为true,则返回 a ,否则返回 b 。这里我们可以使用三目运算符嵌套来完成此题。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
int s;// 学生成绩
printf("请输入分数: ");
scanf("%d", &s);// 输入成绩
char g = (char) (s >= 90 ? 'A' : (s >= 60 ? 'B' : 'C'));
printf("%c", g);
return 0;
}

运行结果:

请输入分数:96
A

016,最大公约数和最小公倍数

题目:输入两个正整数 a 和 b ,求其最大公约数和最小公倍数。

问题分析:最大公约数可以使用辗转相除法和更相减损术两种方式求,这里我们使用辗转相除法来计算最大公约数。最小公倍数可以用输入的两个数之积除于它们的最大公约数求。比如计算 33 和 12 的最大公约数,(33,12)→(12,9)→(9,3),因为 9 能被 3 整除,所以33和12的最大公约数是 3 。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

// 辗转相除法求最大公约数
int gcd(int a, int b) {
if (a < b)// 要保证 a 比 b 大
return gcd(b, a);
if (a % b == 0)// 如果 a 能被 b 整除,直接返回 b 的值。
return b;
return gcd(b, a % b);// 递归
}

int main() {
int a, b;
printf("请输入两个数字:\n");
scanf("%d %d", &a, &b);// 不能有 0 。
int t = gcd(a, b);// 计算最大公约数
int y = a * b / t;// 根据最大公约数计算最小公倍数
printf("这两个数的最大公约数是%d,最小公倍数是%d\n", t, y);
return 0;
}

运行结果:

请输入两个数字:
12 28
这两个数的最大公约数是4,最小公倍数是84

017,统计字母、数字等

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

问题分析:对于输入字符进行统计,直到遇到换行符为止。

/**
* Created by 公众号:数据结构和算法
* Copyright ? wansuanfa.com All rights reserved.
*/

#include

int main() {
char c;// 输入的字符
int l = 0, s = 0, d = 0, t = 0;
printf("请输入一些字符:\n");
while ((c = getchar()) != '\n') {// 直到遇到换行符为止
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
l++;// 英文字母
} else if (c >= '0' && c <= '9') {
d++;// 数字
} else if (c == ' ') {
s++;// 空格
} else {
t++;// 其他字符
}
}
printf("字母=%d, 数字=%d, 空格 =%d, 其他=%d", l, d, s, t);
return 0;
}

运行结果:

请输入一些字符:
wansuanfa.com 666&*()
字母 = 12, 数字 = 3, 空格 = 1, 其他 = 5

018,s=a+aa+aaa...

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

问题分析:输入的 n 是数字的个数,把所有数字相加即可。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
int s = 0, a, n, t;
printf("请输入 a 和 n:\n");
scanf("%d %d", &a, &n);
t = a;
while (n > 0) {
s += t;
a = a * 10;
t += a;
n--;
}
printf("a+aa+...=%d\n", s);
return 0;
}

运行结果:

请输入 a 和 n:
2 5
a+aa+...=24690

019,完数

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

问题分析:计算1000以内每个数的因数,判断因数之和是否等于该数,如果等于,则是完数,否则不是。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
int k, a[256];
for (int i = 1; i < 1000; i++) {
int sum = 0;// 累加因子之和
k = 0;
for (int j = 1; j <= i / 2; j++)
if (i % j == 0) {
sum += j;
a[k++] = j;// 记录因子
}
if (i == sum) {// 是否是完数
printf("%d=%d", i, a[0]);
for (int j = 1; j < k; ++j)
printf("+%d", a[j]);// 打印因子
printf("\n");// 换行
}
}
return 0;
}

运行结果:

6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248

020,小球自由下落

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

问题分析:反弹的高度是原来的一半,路径是反弹高度的两倍,因为反弹需要上和下两个方向。

/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/

#include

int main() {
float h = 100;// 初始高度
float s = 100;// 经过的长度
for (int i = 1; i <= 10; i++) {
h = h / 2;// 每次反弹的高度是原来的一半
s += 2 * h;// 经过长度需要累加反弹高度的2倍
}
printf("第10次落地时,共经过%f米,第10次反弹高%f米\n", s, h);
return 0;
}

运行结果:

第10次落地时,共经过299.804688米,第10次反弹高0.097656米

021,猴子吃桃问题

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

问题分析:采取逆向思维的方法,从后往前推断。第 10 天 1 个桃子,第 9 天是2*(1+1)=4个桃子,第 8天是2*(4+1)=10个桃子,以此类推,如果当天吃了 x 个桃子,那么前一天就是2*(x+1)个桃子。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
int n = 1;
for (int i = 1; i < 10; i++)
n = (n + 1) * 2;
printf("总数为:%d", n);
return 0;
}

运行结果:

总数为:1534

022,乒乓球推理

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

问题分析:c 不和 x,z 比,所以 c 只能和 y 比,a 不和 x 比,所以 a 只能和 z 比,那么 b 只能和 x 比,直接能推算出来,但这里要写出程序,我们来看下。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
for (int a = 'y'; a <= 'z'; a++) {// a 不能和 x 比,跳过 x
for (int b = 'x'; b <= 'z'; b++) {// b
if (a == b)// a与b不能和同一个人比较
continue;
for (int c = 'y'; c <= 'y'; c++) {// c不和x,z比
if (a != c && b != c)// c与a,c不能和同一个人比较,
printf("笔试名单为:a--%c\tb--%c\tc--%c\n",
a, b, c);
}
}
}
return 0;
}

运行结果:

顺序为:a--z b--x c--y

023,打印菱形

题目:打印出如下图案(菱形)。

*
***
*****
*******
*****
***
*

问题分析:先把菱形分成两部分来看待,先打印前 4 行,在打印后 3 行。每行只打印左边的空格,右边的空格不需要打印。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
for (int i = 0; i <= 3; i++) {// 包括之间一行,总共4行
for (int j = 0; j <= 2 - i; j++)
printf(" ");// 左边的空格
for (int k = 0; k <= 2 * i; k++)
printf("*");
printf("\n");// 换行
}
for (int i = 0; i <= 2; i++) {// 下面打印3行
for (int j = 0; j <= i; j++)
printf(" ");// 左边的空格
for (int k = 0; k <= 4 - 2 * i; k++)
printf("*");
printf("\n");
}
return 0;
}

运行结果:

*
***
*****
*******
*****
***
*

024,2/1+3/2+5/3...

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

问题分析:如果把分子和分母单独拿出来,它们都是斐波那契数列,可以参考011,兔子生崽,直接累加分数即可。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
float sum = 0;// 记录分数之和
float t, a = 2, b = 1;// a 是分子,b是分母
for (int i = 1; i <= 20; i++) {
sum += a / b;// 累加分数
// 更新 a ,b 的值
t = a + b;
b = a;
a = t;
}
printf("%9.6f\n", sum);
return 0;
}

运行结果:

32.660263

025,求阶乘的和

题目:求 1 + 2! + 3! + ... + 20! 的和。

问题分析:计算阶乘的值然后累加即可。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
long double sum = 0, m = 1;
for (int i = 1; i <= 20; i++) {
m *= i;// 计算阶乘
sum += m;// 累加阶乘值
}
printf("%Lf\n", sum);
return 0;
}

运行结果:

2561327494111820313.000000

026,递归求阶乘

题目:利用递归方法求5!。

问题分析:递归公式fun(n)=fun(n-1)*n,当 n 等于 1 的时候,直接返回 1 即可。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int fun(int n) {
if (n == 1)
return 1;
return fun(n - 1) * n;// 递归
}

int main() {
for (int i = 1; i <= 5; i++)
printf("%d!=%d\n", i, fun(i));
return 0;
}

运行结果:

1!=1
2!=2
3!=6
4!=24
5!=120

027,逆序打印字符

题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

问题分析:当输入的字符个数不够 5 个的时候,一直递归输入,当输入 5 个字符的时候开始输出。递归类似于栈,先压栈,后出栈,所以出栈的顺序和输入的顺序是相反的。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

void print(int n) {
char ch = getchar();// 输入字符
if (n <= 1) {// n 等于 1 的时候开始输出
printf("相反顺序输出结果:");
} else {
print(n - 1);// 递归
}
putchar(ch);// 输出字符。
}

int main() {
int i = 5;
printf("请输入%d个字符:", i);
print(i);
return 0;
}

运行结果:

请输入5个字符:qwert
相反顺序输出结果:trewq

028,岁数推理

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

问题分析:使用递归的方式,第一个人是 10 岁,第 n 个人的年龄是第 n-1 个人的年龄加 2 。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int age(int n) {
if (n == 1)// 第一个人是 10 岁
return 10;
return age(n - 1) + 2;// 递归
}

int main() {
printf("第五个人的岁数是:%d\n", age(5));
return 0;
}

运行结果:

第五个人的岁数是:18

029,逆序打印各位数字

题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

问题分析:最多5位数,可以获取数字的每一位,如果万位不等于 0 ,肯定是 5 位数,如果万位是 0 ,千位不等于 0 ,则是 4 位数……,根据这样判断,然后逆序输出。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
int x;
printf("请输入 5 位数字:");
scanf("%d", &x);
int a = x / 10000; // 万位数
int b = x % 10000 / 1000; // 千位数
int c = x % 1000 / 100; // 百位数
int d = x % 100 / 10; // 十位数
int e = x % 10; // 个位数
if (a != 0) {
printf("是5位数,逆序为:%d %d %d %d %d", e, d, c, b, a);
} else if (b != 0) {
printf("是4位数,逆序为:%d %d %d %d", e, d, c, b);
} else if (c != 0) {
printf("是3位数,逆序为:%d %d %d", e, d, c);
} else if (d != 0) {
printf("是2位数,逆序为:%d %d", e, d);
} else if (e != 0) {
printf("是1位数,逆序为:%d", e);
}
return 0;
}/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
int x;
printf("请输入 5 位数字:");
scanf("%d", &x);
int a = x / 10000; // 万位数
int b = x % 10000 / 1000; // 千位数
int c = x % 1000 / 100; // 百位数
int d = x % 100 / 10; // 十位数
int e = x % 10; // 个位数
if (a != 0) {
printf("是5位数,逆序为:%d %d %d %d %d", e, d, c, b, a);
} else if (b != 0) {
printf("是4位数,逆序为:%d %d %d %d", e, d, c, b);
} else if (c != 0) {
printf("是3位数,逆序为:%d %d %d", e, d, c);
} else if (d != 0) {
printf("是2位数,逆序为:%d %d", e, d);
} else if (e != 0) {
printf("是1位数,逆序为:%d", e);
}
return 0;
}

运行结果:

请输入 5 位数字:12345
是5位数,逆序为:5 4 3 2 1

030,判断是否回文数

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

问题分析:一个5位数,只需要提取它的个位,十位,千万,万位数字即可,如果个位和万位数字相等,并且十位和千位数字相等,则是回文数,否则不是。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
int x;
printf("请输入 5 位数字:");
scanf("%d", &x);
int wan = x / 10000; // 万位数
int qian = x % 10000 / 1000; // 千位数
int shi = x % 100 / 10; // 十位数
int ge = x % 10; // 个位数
if (ge == wan && shi == qian) {
printf("这是回文数");
} else {
printf("这不是回文数");
}
return 0;
}

运行结果:

请输入 5 位数字:12321
这是回文数

031,判断星期几

题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

问题分析:使用Switch语句,如果第一个字母一样,则输入第二个怎么继续判断。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include

int main() {
char i, j;
printf("请输入第一个字母:");
scanf("%c", &i);// 输入字符
getchar();// 获取换行符。
switch (i) {
case 'm':
printf("monday");// 周一
break;
case 'w':
printf("wednesday");// 周三
break;
case 'f':
printf("friday");// 周五
break;
case 't':
printf("请输入下一个字母:");
scanf("%c", &j);
if (j == 'u') {// 周二
printf("tuesday");
break;
}
if (j == 'h') {// 周四
printf("thursday");
break;
}
case 's':
printf("请输入下一个字母");
scanf("%c", &j);
if (j == 'a') {// 周六
printf("saturday");
break;
}
if (j == 'u') {// 周日
printf("sunday");
break;
}
default :
printf("error");
break;
}
return 0;
}

运行结果:

请输入第一个字母:t
请输入下一个字母:u
tuesday

032,删字符串中的指定字母

题目:删除一个字符串中的指定字母,如:字符串 "aca",删除其中的 a 字母。

问题分析:逐个判断原字符串中的字符是否是需要删除的,如果不是删除的则保留。

/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/

#include
#include

// 删除字符串中指定字母
char *deleteCharacters(char *str, char *del) {
// 如果要删除的字符集为空,则直接返回原字符串
if (del == NULL)
return str;
// 用于存储要删除的字符的哈希表
int hash[256] = {0};
// 标记哪些字符需要删除
for (int i = 0; i < strlen(del); i++)
hash[del[i]] = 1;

int curIndex = 0;
// 通过遍历字符串来删除指定的字符
for (int i = 0; i < strlen(str); i++) {
// 如果当前字符不在要删除的字符集中,则保留该字符
if (!hash[str[i]])
str[curIndex++] = str[i];
}
str[curIndex] = '\0'; // 字符串结束的标志
return str;
}

int main() {
char s1[] = "acasftd"; // 原字符串
char s2[] = "as"; // 要删除的字母
&nbsp...

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
认知颠覆,美国移民被合法吃绝户,十年时间,全美移民资产跌9成

认知颠覆,美国移民被合法吃绝户,十年时间,全美移民资产跌9成

孤单是寂寞的毒
2026-01-30 20:19:03
深圳长城开发科技股份有限公司原党委书记陈朱江接受审查调查

深圳长城开发科技股份有限公司原党委书记陈朱江接受审查调查

界面新闻
2026-02-02 16:02:00
年底大扫除,我2小时搞定!这9个清洁妙招,妈看了都会夸

年底大扫除,我2小时搞定!这9个清洁妙招,妈看了都会夸

Home范
2026-02-01 16:15:03
2026年养老金22连涨成定局!40年工龄、5000元每月,能涨多少钱?

2026年养老金22连涨成定局!40年工龄、5000元每月,能涨多少钱?

猫叔东山再起
2026-02-02 11:00:09
美司法部公布爱泼斯坦案新照 两只鸡中间被涂黑

美司法部公布爱泼斯坦案新照 两只鸡中间被涂黑

看看新闻Knews
2026-02-01 18:31:09
奖金缩水,阿尔卡拉斯夺冠后将缴纳134.9万澳元税款

奖金缩水,阿尔卡拉斯夺冠后将缴纳134.9万澳元税款

懂球帝
2026-02-02 14:18:30
资深音乐人袁惟仁病逝!生前因脑溢血卧病在床8年,老狼发文悼念

资深音乐人袁惟仁病逝!生前因脑溢血卧病在床8年,老狼发文悼念

萌神木木
2026-02-02 17:45:39
这种饮料正在摧毁你的胰岛细胞!很多糖尿病,都和这种饮料有关!

这种饮料正在摧毁你的胰岛细胞!很多糖尿病,都和这种饮料有关!

蜉蝣说
2026-01-29 14:46:50
黄金、白银价格跳水后反弹!

黄金、白银价格跳水后反弹!

闪电新闻
2026-02-02 09:21:47
继续开抢!美媒更新交易市场TOP12大鱼:字母哥夺魁浓眉哥屈居第6

继续开抢!美媒更新交易市场TOP12大鱼:字母哥夺魁浓眉哥屈居第6

锅子篮球
2026-02-02 20:58:56
恭喜!她怀二胎了!

恭喜!她怀二胎了!

奋斗在韩国
2026-02-02 19:31:44
20元烟花因燃出200元的效果走红,江西一女子称其为“报恩烟花”,厂家:去年卖出200多万个

20元烟花因燃出200元的效果走红,江西一女子称其为“报恩烟花”,厂家:去年卖出200多万个

极目新闻
2026-02-02 16:14:30
官方:浙江德比中稠州球迷使用不文明口号,扣除稠州纪律分1.25分

官方:浙江德比中稠州球迷使用不文明口号,扣除稠州纪律分1.25分

懂球帝
2026-02-02 21:16:08
烤匠上海首店开业排队近4000桌最长等位13小时

烤匠上海首店开业排队近4000桌最长等位13小时

界面新闻
2026-02-02 10:17:03
留学一年嘴都变大了?女留学生“面相变化图”走红

留学一年嘴都变大了?女留学生“面相变化图”走红

没有偏旁的常庆
2026-02-02 06:10:03
你什么状元我什么状元!文班和班凯罗今日一战根本不在一个级别!

你什么状元我什么状元!文班和班凯罗今日一战根本不在一个级别!

田先生篮球
2026-02-02 14:56:46
癌症去世的人越来越多?医生反复叮嘱:宁可打打牌,也别做这5事

癌症去世的人越来越多?医生反复叮嘱:宁可打打牌,也别做这5事

医学原创故事会
2026-01-25 22:54:04
富士通杯决赛,聂卫平并非贬低马晓春,小林光一也认为自己优势

富士通杯决赛,聂卫平并非贬低马晓春,小林光一也认为自己优势

月满大江流
2026-02-02 19:00:36
韩国股市大跌触发熔断机制

韩国股市大跌触发熔断机制

第一财经资讯
2026-02-02 15:09:30
老外看不下去了!吐槽国产手机抄袭iPhone:为了像苹果 3个摄像头里有1个是假的

老外看不下去了!吐槽国产手机抄袭iPhone:为了像苹果 3个摄像头里有1个是假的

快科技
2026-02-01 11:55:44
2026-02-02 21:48:49
数据结构和算法
数据结构和算法
专门介绍和写算法题解的号
263文章数 3关注度
往期回顾 全部

科技要闻

阿里筑墙,腾讯寄生,字节偷家

头条要闻

媒体:巴拿马要付出沉重代价 香港长和也该彻底清醒了

头条要闻

媒体:巴拿马要付出沉重代价 香港长和也该彻底清醒了

体育要闻

澳网男单决赛,属于阿尔卡拉斯的加冕仪式

娱乐要闻

57岁音乐人袁惟仁去世,家属发文悼念

财经要闻

金银暴跌 全球股市遭遇“黑色星期一”

汽车要闻

雷克萨斯LC500将于今年底停产 "最美雷克萨斯"谢幕

态度原创

本地
时尚
家居
公开课
军事航空

本地新闻

云游中国|拨开云雾,巫山每帧都是航拍大片

霸榜热搜,尺度惊人,他绝对值得你追

家居要闻

现代几何彩拼 智焕童梦居

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

委内瑞拉外长会见美外交使团团长

无障碍浏览 进入关怀版