JSK-23 計數和數數【數列】
阿新 • • 發佈:2018-12-10
“伯爵說”序列如下:1,11,21,1211,111221,…。其1
讀作one 1
或者11
。11
讀作two 1s
或者21
。21
讀作one 2, one 1
或者1211
。
輸入格式
多組輸入,讀到檔案結束。每組輸入給定一個整數 n(1≤n≤30)。
輸出格式
輸出第 n 個序列。注意,整數序列以字串的形式表示。
樣例輸入
6
樣例輸出
312211
問題描述:(略)
問題分析:
這個實際上就是Look and Say數列。該數列在OEIS中的編號是A005150。
之前寫了一個考慮多了,邏輯有點複雜,參見參考連結。因為連續數字的數量不會超過一位數字,程式碼可以寫得更簡單。
這個題解是按打表的方式來寫的,相對會通用一些。
程式說明:
用C語言程式設計,數列可以儲存在二維字元陣列中;用C++語言程式設計的話,可以儲存在字串陣列中。
符號常量M的值取多少,需要實現算一下才能知道。它關乎最長的字串有多長。
題記:數列問題是常見的問題。
AC的C語言程式如下:
/* JSK-23 計數和數數 */ #include <stdio.h> #include <string.h> //#define DEBUG #define N 30 #define M 5000 char a[N + 1][M]; void init() { a[1][0] = '1'; a[1][1] = '\0'; char look; int say, i, j; for(i = 2; i <= N; i++) { // Look and Say轉換:一邊讀入一邊轉換 int k = 0; look = a[i - 1][0]; say = 1; for(j = 1; a[i - 1][j]; j ++) { if(a[i - 1][j] == look) say++; else { a[i][k++] = '0' + say; a[i][k++] = look; look = a[i - 1][j]; say = 1; } } a[i][k++] = '0' + say; a[i][k++] = look; a[i][k] = '\0'; } } int main() { init(); #ifdef DEBUG printf("%d\n", (int)strlen(a[N])); #endif int n; while(scanf("%d", &n) != EOF) printf("%s\n", a[n]); return 0; }