以下是不同屆藍橋杯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)。
?
如果需要某屆具體題目的代碼或更多解析,可以進一步說明!