c语言 蓝桥杯 算法题

蓝桥杯 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;
}

 
 
 

有什么不懂的地方 随时在评论区提问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值