計蒜客 — 計數和數數
阿新 • • 發佈:2018-11-03
https://nanti.jisuanke.com/t/23
計數和數數
- 時間限制 1000ms
- 空間限制 65536K
“伯爵說”序列如下: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
提示
相信你已經看懂了題目,如果沒看懂,小提示下,
其實類似於求“斐波那契”數列的第 n 項哦~
解題思路
我是用的結構體做的,一個存每一位的數,另一個存有多少位。類似於斐波那契,首先先打表。
#include <iostream> using namespace std; struct node { int s[4500], n; }fib[35]; int main() { int n, m; fib[0].s[fib[0].n++] = 1; //第一個序列為1 for (int i = 1; i < 30; i++) { m = 0; //記錄上個序列每一位的個數 for (int j = 0; j < fib[i - 1].n; j++) { m++; //個數加1 if (fib[i - 1].s[j] != fib[i - 1].s[j + 1]) { fib[i].s[fib[i].n++] = m; //先把位的個數存下來 fib[i].s[fib[i].n++] = fib[i - 1].s[j]; //再把這一位存下來 m = 0; //相鄰兩項不同,則開始重新計數 } } } while (cin >> n) { for (int j = 0; j < fib[n - 1].n; j++) cout << fib[n - 1].s[j]; cout << endl; } return 0; }