蓝桥杯 C 语言 30个经典算法题
30个经典算法题
- 蓝桥杯 C 语言 30个经典算法题
- 1. 1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?
- 2. 企业发放的奖金根据利润提成。其实就是考分类。
- 3. 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
- 4. 输入某年某月某日,判断这一天是这一年的第几天?
- 5. 输入三个整数X,Y,Z,请把这三个数由小到大输出。
- 6. 用*号输出字母Ç的图案。
- 7. 输出特殊图案。
- 9. 要求输出国际象棋棋盘。
- 10. 打印楼梯,同时在楼梯上方打印两个笑脸。
- 11. 古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
- 12. 判断101到200之间的素数。
- 13. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方。
- 14. 将一个正整数分解质量数例如:输入90,打印出90 = 2 * 3 * 3 * 5。
- 15. 利用条件运算符的嵌套来完成此题:学习成绩> = 90分的同学用甲表示,60-89分之间的用乙表示,60分以下的用Ç表示。
- 16. 输入两个正整数米和N,求其最大公约数和最小公倍数。
- 17. 输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。
- 18. 求S = A + AA + AAA + AAAA + AA ...一个的值,其中一个是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制。
- 19. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1 + 2 + 3.编程找出1000以内的所有完数。
- 20. 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米第10次反弹多高?
- 21. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
- 22. 两个乒乓球队进行比赛,各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单.A说他不和X比,C说他不和X,Z比,请编程序找出三队赛手的名单。
- 23. 打印出如下图案(菱形)。
- 24. 有一分数序列:2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 ...求出这个数列的前20项之和。
- 25. 求1 + 2!+3!+ ... + 20!的和。
- 26. 利用递归方法求5!
- 27. 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
- 28. 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
- 29. 给一个不多于5位的正整数,要求:一,求它是几位数,二,逆序打印出各位数字。
- 30. 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
1. 1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?
答案:
- 可以组成 24 个三位数。
- 三位数分别是: 123, 124, 132, 134, 142, 143, 213, 214, 231, 234, 241, 243, 312, 314, 321, 324, 341, 342, 412, 413, 421, 423, 431, 432.
代码示例:
#include <stdio.h>
int main() {
int i, j, k;
for (i = 1; i <= 4; i++) {
for (j = 1; j <= 4; j++) {
for (k = 1; k <= 4; k++) {
if (i != j && i != k && j != k) {
printf("%d%d%d\
", i, j, k);
}
}
}
}
return 0;
}
2. 企业发放的奖金根据利润提成。其实就是考分类。
答案:
- 这道题比较开放,需要根据题目提供的具体利润提成规则进行分类。
- 例如,可以根据利润等级分为三个档次,分别对应不同的提成比例。
- 具体实现需要根据题目要求提供更多信息。
3. 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
答案:
- 该数是 119。
代码示例:
#include <stdio.h>
#include <math.h>
int main() {
int num;
for (num = 1; num < 1000; num++) {
if (sqrt(num + 100) == (int)sqrt(num + 100) &&
sqrt(num + 100 + 168) == (int)sqrt(num + 100 + 168)) {
printf("该数是:%d\n", num);
break;
}
}
return 0;
}
4. 输入某年某月某日,判断这一天是这一年的第几天?
答案:
- 需要根据每个月的日数进行累加计算。
- 需要考虑闰年。
代码示例:
#include <stdio.h>
int main() {
int year, month, day, sum = 0;
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
printf("请输入年份:");
scanf("%d", &year);
printf("请输入月份:");
scanf("%d", &month);
printf("请输入日期:");
scanf("%d", &day);
// 判断是否为闰年
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
days[1] = 29;
}
// 计算天数
for (int i = 0; i < month - 1; i++) {
sum += days[i];
}
sum += day;
printf("%d年%d月%d日是这一年的第%d天\
", year, month, day, sum);
return 0;
}
5. 输入三个整数X,Y,Z,请把这三个数由小到大输出。
答案:
- 使用比较和交换操作进行排序。
代码示例:
#include <stdio.h>
int main() {
int x, y, z, temp;
printf("请输入三个整数:");
scanf("%d %d %d", &x, &y, &z);
// 排序
if (x > y) {
temp = x;
x = y;
y = temp;
}
if (x > z) {
temp = x;
x = z;
z = temp;
}
if (y > z) {
temp = y;
y = z;
z = temp;
}
printf("从小到大排序后的结果为:%d %d %d\
", x, y, z);
return 0;
}
6. 用*号输出字母Ç的图案。
答案:
- 使用循环控制打印星号,形成字母Ç的形状。
代码示例:
#include <stdio.h>
int main() {
// 上半部分
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i == 0 && j != 4 || i == 1 && j == 4 || i == 2 && j == 4 || i == 3 && j == 4 || i == 4 && j == 4) {
printf("*");
} else {
printf(" ");
}
}
printf("\
");
}
// 下半部分
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i == 4 && j == 0 || i == 4 && j == 1 || i == 4 && j == 2 || i == 4 && j == 3 || i == 4 && j == 4) {
printf("*");
} else {
printf(" ");
}
}
printf("\
");
}
return 0;
}
7. 输出特殊图案。
答案:
- 需要根据题目给定的特殊图案进行设计和实现。
- 可以根据图案的形状和结构,使用循环控制打印不同的字符。
代码示例:
- 具体实现需要根据题目提供的图案进行修改。
8. 输出9 * 9口诀。
答案:
- 使用循环控制打印乘法运算结果。
代码示例:
#include <stdio.h>
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d * %d = %d ", j, i, i * j);
}
printf("\
");
}
return 0;
}
9. 要求输出国际象棋棋盘。
答案:
- 使用循环控制打印不同的字符,形成棋盘的黑白交替图案。
代码示例:
#include <stdio.h>
int main() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if ((i + j) % 2 == 0) {
printf(" ");
} else {
printf("#");
}
}
printf("\
");
}
return 0;
}
10. 打印楼梯,同时在楼梯上方打印两个笑脸。
答案:
- 使用循环控制打印星号和空格,形成楼梯的形状。
- 可以使用 ASCII 字符表示笑脸。
代码示例:
#include <stdio.h>
int main() {
printf(" ^_^ ^_^ \
");
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
printf("*");
}
printf("\
");
}
return 0;
}
11. 古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
答案:
- 这是著名的斐波那契数列问题。
代码示例:
#include <stdio.h>
int main() {
int f[40];
f[0] = 1; // 第一个月有 1 对兔子
f[1] = 1; // 第二个月有 1 对兔子
for (int i = 2; i < 40; i++) {
f[i] = f[i - 1] + f[i - 2]; // 每个月的兔子数是前两个月的兔子数之和
}
printf("每个月的兔子总数为:\
");
for (int i = 0; i < 40; i++) {
printf("第%d个月:%d\
", i + 1, f[i]);
}
return 0;
}
12. 判断101到200之间的素数。
答案:
- 使用循环判断是否能被 2 到 sqrt(n) 之间的整数整除。
代码示例:
#include <stdio.h>
#include <math.h>
int main() {
for (int i = 101; i <= 200; i++) {
int isPrime = 1;
for (int j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
isPrime = 0;
break;
}
}
if (isPrime) {
printf("%d 是素数\
", i);
}
}
return 0;
}
13. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方。
答案:
- 使用循环遍历 100 到 999 的所有三位数,判断其是否满足水仙花数的条件。
代码示例:
#include <stdio.h>
int main() {
for (int i = 100; i <= 999; i++) {
int a = i / 100;
int b = (i % 100) / 10;
int c = i % 10;
if (i == a * a * a + b * b * b + c * c * c) {
printf("%d 是水仙花数\
", i);
}
}
return 0;
}
14. 将一个正整数分解质量数例如:输入90,打印出90 = 2 * 3 * 3 * 5。
答案:
- 使用循环判断并分解质因数。
代码示例:
#include <stdio.h>
int main() {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
printf("%d = ", n);
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
printf("%d * ", i);
n /= i;
}
}
printf("\
");
return 0;
}
15. 利用条件运算符的嵌套来完成此题:学习成绩> = 90分的同学用甲表示,60-89分之间的用乙表示,60分以下的用Ç表示。
答案:
- 使用条件运算符根据分数进行判断和输出。
代码示例:
#include <stdio.h>
int main() {
int score;
printf("请输入分数:");
scanf("%d", &score);
char grade = (score >= 90) ? '甲' : (score >= 60) ? '乙' : 'Ç';
printf("等级为:%c\
", grade);
return 0;
}
16. 输入两个正整数米和N,求其最大公约数和最小公倍数。
答案:
- 使用辗转相除法求最大公约数。
- 最小公倍数 = 两数之积 / 最大公约数。
代码示例:
#include <stdio.h>
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int m, n;
printf("请输入两个正整数:");
scanf("%d %d", &m, &n);
int greatestCommonDivisor = gcd(m, n);
int leastCommonMultiple = (m * n) / greatestCommonDivisor;
printf("最大公约数:%d\
", greatestCommonDivisor);
printf("最小公倍数:%d\
", leastCommonMultiple);
return 0;
}
17. 输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。
答案:
- 使用循环遍历字符数组,判断每个字符的类型并进行计数。
代码示例:
#include <stdio.h>
int main() {
char str[100];
int letterCount = 0, spaceCount = 0, digitCount = 0, otherCount = 0;
printf("请输入一行字符:");
gets(str);
for (int i = 0; str[i] != '\0'; i++) {
if (isalpha(str[i])) {
letterCount++;
} else if (isspace(str[i])) {
spaceCount++;
} else if (isdigit(str[i])) {
digitCount++;
} else {
otherCount++;
}
}
printf("英文字母个数:%d\
", letterCount);
printf("空格个数:%d\
", spaceCount);
printf("数字个数:%d\
", digitCount);
printf("其它字符个数:%d\
", otherCount);
return 0;
}
18. 求S = A + AA + AAA + AAAA + AA …一个的值,其中一个是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制。
答案:
- 可以使用循环累加,或者使用公式进行计算。
代码示例:
#include <stdio.h>
int main() {
int a, n, sum = 0, num = 0;
printf("请输入数字A:");
scanf("%d", &a);
printf("请输入数字个数N:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
num = num * 10 + a; // 生成下一个数
sum += num;
}
printf("S = %d\
", sum);
return 0;
}
19. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1 + 2 + 3.编程找出1000以内的所有完数。
答案:
- 使用循环遍历 1 到 1000 的所有整数,判断其是否为完数。
代码示例:
#include <stdio.h>
int main() {
for (int i = 1; i <= 1000; i++) {
int sum = 1; // 因子之和,默认包含 1
for (int j = 2; j <= i / 2; j++) {
if (i % j == 0) {
sum += j;
}
}
if (sum == i) {
printf("%d 是完数\
", i);
}
}
return 0;
}
20. 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米第10次反弹多高?
答案:
- 可以使用循环计算总路径长度和反弹高度。
代码示例:
#include <stdio.h>
int main() {
double height = 100.0;
double totalDistance = height;
for (int i = 1; i <= 10; i++) {
height /= 2;
totalDistance += height * 2; // 上升和下降的距离都计入总距离
}
printf("第10次落地时,共经过%.2f米\
", totalDistance);
printf("第10次反弹高度为%.2f米\
", height);
return 0;
}
21. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
答案:
- 使用逆推的方法,从最后一天开始,逐步推算第一天摘的桃子数量。
代码示例:
#include <stdio.h>
int main() {
int num = 1;
for (int i = 9; i >= 1; i--) {
num = (num + 1) * 2; // 每天早上吃了剩下的桃子的一半加一个,所以反推回来要乘以 2 再加 1
}
printf("第一天共摘了%d个桃子\
", num);
return 0;
}
22. 两个乒乓球队进行比赛,各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单.A说他不和X比,C说他不和X,Z比,请编程序找出三队赛手的名单。
答案:
- 使用逻辑推理,分析队员的言论,排除不可能的组合,得出最终的比赛名单。
代码示例:
#include <stdio.h>
int main() {
// 首先根据A的言论,可以排除 A 和 X 比赛的组合
// 然后根据 C 的言论,可以排除 C 和 X 比赛的组合,以及 C 和 Z 比赛的组合
// 剩下的可能性只有两种:
// 1. A 和 Y 比赛,B 和 Z 比赛,C 和 X 比赛
// 2. A 和 Z 比赛,B 和 X 比赛,C 和 Y 比赛
printf("比赛名单可能是:\
");
printf("1. A 和 Y 比赛,B 和 Z 比赛,C 和 X 比赛\
");
printf("2. A 和 Z 比赛,B 和 X 比赛,C 和 Y 比赛\
");
return 0;
}
23. 打印出如下图案(菱形)。
答案:
- 使用循环控制打印星号和空格,形成菱形的形状。
代码示例:
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5 - i; j++) {
printf(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
printf("*");
}
printf("\
");
}
for (int i = 4; i >= 1; i--) {
for (int j = 1; j <= 5 - i; j++) {
printf(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
printf("*");
}
printf("\
");
}
return 0;
}
24. 有一分数序列:2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 …求出这个数列的前20项之和。
答案:
- 该数列是斐波那契数列,分子和分母分别构成斐波那契数列。
代码示例:
#include <stdio.h>
int main() {
double sum = 0.0;
int f[20];
f[0] = 1; // 第一个分子
f[1] = 2; // 第二个分子
for (int i = 2; i < 20; i++) {
f[i] = f[i - 1] + f[i - 2]; // 生成斐波那契数列
}
for (int i = 0; i < 20; i++) {
sum += (double)f[i] / f[i + 1]; // 计算每项的值
}
printf("前20项之和为:%.2f\
", sum);
return 0;
}
25. 求1 + 2!+3!+ … + 20!的和。
答案:
- 使用循环计算每个阶乘的值,并进行累加。
代码示例:
#include <stdio.h>
int main() {
long long sum = 1, factorial = 1;
for (int i = 1; i <= 20; i++) {
factorial *= i; // 计算 i 的阶乘
sum += factorial;
}
printf("1 + 2! + 3! + ... + 20! 的和为:%lld\
", sum);
return 0;
}
26. 利用递归方法求5!
答案:
- 使用递归函数调用,实现阶乘的计算。
代码示例:
#include <stdio.h>
long long factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
long long result = factorial(5);
printf("5! = %lld\
", result);
return 0;
}
27. 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
答案:
- 使用递归函数调用,实现字符的逆序输出。
代码示例:
#include <stdio.h>
void reversePrint(char str[], int index) {
if (index == -1) {
return;
}
printf("%c", str[index]);
reversePrint(str, index - 1);
}
int main() {
char str[6]; // 5个字符 + 结束符
printf("请输入5个字符:");
scanf("%s", str);
reversePrint(str, 4); // 从最后一个字符开始打印
printf("\
");
return 0;
}
28. 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
答案:
- 第五个人 18 岁。
代码示例:
#include <stdio.h>
int main() {
int age = 10;
for (int i = 1; i <= 4; i++) {
age += 2;
}
printf("第五个人%d岁\
", age);
return 0;
}
29. 给一个不多于5位的正整数,要求:一,求它是几位数,二,逆序打印出各位数字。
答案:
- 使用循环和取余运算进行判断和输出。
代码示例:
#include <stdio.h>
int main() {
int num, count = 0, digit;
printf("请输入一个不多于5位的正整数:");
scanf("%d", &num);
// 判断位数
int temp = num;
while (temp > 0) {
temp /= 10;
count++;
}
printf("该数是%d位数\
", count);
// 逆序打印
printf("逆序打印为:");
while (num > 0) {
digit = num % 10; // 获取个位数字
printf("%d", digit);
num /= 10; // 去掉个位数字
}
printf("\
");
return 0;
}
30. 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
答案:
- 使用循环和取余运算进行判断。
代码示例:
#include <stdio.h>
int main() {
int num, temp, reversedNum = 0;
printf("请输入一个5位数:");
scanf("%d", &num);
temp = num; // 备份原数
while (temp > 0) {
reversedNum = reversedNum * 10 + temp % 10; // 反转数字
temp /= 10;
}
if (num == reversedNum) {
printf("%d 是回文数\
", num);
} else {
printf("%d 不是回文数\
", num);
}
return 0;
}