1. 程式人生 > >JSK-23 計數和數數【數列】

JSK-23 計數和數數【數列】

計數和數數

“伯爵說”序列如下:1,11,21,1211,111221,…。其1讀作one 1或者1111讀作two 1s或者2121讀作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;
}