「伯爵說」序列如下:1,11,21,1211,111221, \ldots1,
11,2
1,12
11,1
1122
1,…。其1
讀作one 1
或者11
。11
讀作two 1s
或者21
。21
讀作one 2, one 1
或者1211
。
多組輸入,讀到檔案結束。每組輸入給定乙個整數 n(1 \leq n \leq 30)n(
1≤n≤
30)。
輸出第 n
n 個序列。注意,整數序列以字串的形式表示。
樣例輸入
6
樣例輸出
312211
#include#include#includeusing namespace std;
void convert(char *s)
; for(int i=0;i思路:寫出變換的函式:從前向後遍歷陣列,用digit儲存此時遍歷到的數字,用fre儲存這個數字出現的次數。每次遍歷都與前乙個字元比較,若字元相同,則fre++,否則digit儲存新的字元,對應的新fre為1。在main函式中,根據輸入的n,處理n-1次「1」即可。
總結:這道題花費了特別久的時間……遇到了很多問題。
1、我最初的思路是用乙個f陣列儲存1~30以內所有的「伯爵說」數字,然後根據n對應輸出,但是提示超時或者棧溢位。後來改進,每次都對上次的做變換,這樣只要儲存兩個數字即可,解決了這個問題。
2、我用string &s作為convert函式的輸入變數,用s+=fre和s+=digit來儲存字元,仍然提示棧溢位,只能儲存1~7之內的數字。因為這個問題花費了很長時間,後來思考可能是因為+=表示將字元並在原先字元之後,原先的字元空間沒有釋放,這樣佔了非常多的記憶體所以沒通過。但是使用s.empty()或者對s[i]='\0',都沒有解決這個問題。沒有辦法。參考了其他人的**後,將string型別改為了char *作為convert函式的輸入變數,不使用+=,而是對每個字元用fre和digit賦值。解決了這個問題。
3、在main函式裡面,char s[10000]的申明我放在了while語句之外,儘管在每次cout《唉,感覺我的基礎知識還是非常匱乏的,大一學的c++都忘的乾乾淨淨的了,還自信地沒帶回來書。等回學校了要看c++的書。
計蒜客系列 挑戰難題23 計數和數數
伯爵說 序列如下 1,11,21,1211,111221,1 讀作 one 1 或者 11。11 讀作 two 1s 或者21。21 讀作 one 2,one 1 或者 1211。格式 多組輸入,讀到檔案結束。每組輸入給定乙個整數n,輸出第n個序列。1 n 30 注意 整數序列以字串的形式表示。ps...
計蒜客刷題之旅 之 計數和數數
伯爵說 序列如下 1,11,21,1211,111221,ldots1,11,21,1211,111221,其1讀作one 1或者11。11讀作two 1s或者21。21讀作one 2,one 1或者1211。輸入格式 多組輸入,讀到檔案結束。每組輸入給定乙個整數 n 1 leq n leq 30 ...
計蒜客題目 Home Work
臨近開學了,大家都忙著收拾行李準備返校,但 i love c 卻不為此擔心 因為他的心思全在暑假作業上 目前為止還未開動。暑假作業是很多張試卷,我們這些從試卷裡爬出來的人都知道,卷子上的題目有選擇題 填空題 簡答題 證明題等。而做選擇題的好處就在於工作量很少,但又因為選擇題題目都普遍很長。如果有 5...