1. 程式人生 > >計蒜客 — 計數和數數

計蒜客 — 計數和數數

https://nanti.jisuanke.com/t/23

計數和數數

  • 時間限制 1000ms
  • 空間限制 65536K

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