以下是不同届蓝桥杯C语言真题代码示例,供参考:
第十三届蓝桥杯省赛 C语言大学B组
真题:卡片
题目:小蓝有很多数字卡片,每张卡片上都是数字1-9。他想拼出1到n的数列,每张卡片只能用一次,求最大的n。
#include <stdio.h>
int main() {
int cnt[10] = {0}; // 记录各数字卡片数量(初始均为0,实际1的卡片最多2021张)
int n = 0, flag = 1;
// 假设初始1的卡片有2021张,其他数字足够多(题目中1的卡片最先用完)
while (flag) {
n++;
int temp = n;
while (temp > 0) {
int d = temp % 10;
if (d == 1) cnt[1]++; // 统计数字1的使用次数
temp /= 10;
}
if (cnt[1] > 2021) { // 超过2021张时停止
flag = 0;
n--; // 最后一次循环多算了一次,需减1
}
}
printf("%d\n", n); // 输出最大n
return 0;
}
第十二届蓝桥杯省赛 C语言大学A组
真题:平面分割
题目:n条直线最多将平面分成多少个区域(可相交,无重合)。
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
long long res = 1 + n * (n + 1) / 2; // 公式:f(n) = n(n+1)/2 + 1
printf("%lld\n", res);
return 0;
}
第十届蓝桥杯省赛 C语言大学B组
真题:等差数列
题目:给定n个整数,求最少需要添加多少个数,使其成为等差数列。
#include <stdio.h>
#include <stdlib.h>
// 比较函数,用于排序
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
int n, i, d, min_d;
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++) scanf("%d", &a[i]);
qsort(a, n, sizeof(int), cmp); // 排序
if (n <= 2) { // 少于3个数时,公差可为0或任意,直接输出0
printf("0\n");
return 0;
}
// 计算最小公差d(需去重)
min_d = a[1] - a[0];
for (i = 2; i < n; i++) {
d = a[i] - a[i-1];
if (d < min_d) min_d = d;
}
if (min_d == 0) { // 所有数相同,无需添加
printf("0\n");
return 0;
}
// 计算需要添加的数的个数
int total = (a[n-1] - a[0]) / min_d + 1; // 等差数列总项数
printf("%d\n", total - n); // 总项数 - 原数个数
return 0;
}
注意事项:
1. 审题:蓝桥杯题目常隐含边界条件(如数据范围、特殊输入),需仔细阅读题目。
2. 效率:部分题目需优化算法(如排序、数学公式),避免超时。
3. 调试:用样例输入验证代码逻辑,尤其是边界情况(如n=0、n=1)。
如果需要某届具体题目的代码或更多解析,可以进一步说明!