「康威序列」,又稱「Look-and-say 序列」,是一個經典的整數序列:1, 11, 21, 1211, 111221, 312211... 其生成規則極具趣味性——每一項都是對前一項的「讀法」描述。例如:
本題要求輸入 n (1 ≤ n ≤ 30),輸出第 n 項序列。由於數字增長迅速,必須以字符串形式存儲與處理。
採用迭代法:從初始字符串 "1" 開始,重複執行 n-1 次「讀取並生成下一項」的操作。每次迭代掃描當前字符串,統計連續相同字符的個數,按「個數 + 字符」格式拼接生成新字符串。
#include <stdio.h>
#include <string.h>
void generate_next(char *s, int n);
int main() {
int n;
char str[10000]; // 足夠大的緩衝區,n=30 時長度約 446 萬,但題目通常測試較小 n
while (scanf("%d", &n) != EOF) {
strcpy(str, "1");
generate_next(str, n);
printf("%s\n", str);
}
return 0;
}
void generate_next(char *s, int n) {
int i, j, count, len;
char current_char, tmp[10000];
for (j = 1; j < n; ++j) { // 需要迭代 n-1 次
len = 0;
for (i = 0; s[i] != '\0'; ++i) { // 掃描當前字符串
if (i == 0) {
current_char = s[i];
count = 1;
} else {
if (current_char == s[i]) {
++count; // 同字符計數+1
} else {
// 寫入「個數+字符」
len += sprintf(tmp + len, "%d%c", count, current_char);
current_char = s[i]; // 切換到新字符
count = 1;
}
}
}
// 處理最後一組字符
sprintf(tmp + len, "%d%c", count, current_char);
strcpy(s, tmp); // 更新為新字符串
}
}
tmp 暫存生成的新字符串,避免原地修改導致掃描錯亂。%d%c 直接將計數與字符拼接,簡潔高效。char[10000] 僅適用於較小 n;實際工程中應動態分配內存。| 輸入 n | 輸出序列 |
|---|---|
| 1 | 1 |
| 2 | 11 |
| 3 | 21 |
| 4 | 1211 |
| 5 | 111221 |
| 6 | 312211 |
這道題是字符串處理與模擬算法的優秀練習,亦展示了數學規律在編程中的直接應用。