外觀數列是指具有以下特點的整數序列:
d, d1, d111, d113, d11231, d112213111, ...
它從不等於 1 的數字d
開始,序列的第 n+1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個d
,所以就是d1
;第 2 項是 1 個d
(對應d1
)和 1 個 1(對應 11),所以第 3 項就是d111
。又比如第 4 項是d113
,其描述就是 1 個d
,2 個 1,1 個 3,所以下一項就是d11231
。當然這個定義對d
= 1 也成立。本題要求你推算任意給定數字d
的外觀數列的第 n 項。
輸入格式:
輸入第一行給出 [0,9] 範圍內的乙個整數d
、以及乙個正整數 n(≤ 40),用空格分隔。
輸出格式:
在一行中給出數字d
的外觀數列的第 n 項。
輸入樣例:
1 8
輸出樣例:1123123111
題解:
題目描述很簡潔,明顯是乙個遞迴的過程。想起來這和前面那道題字串壓縮差不多,可以把一部分**搬過來。但是關鍵點在於,這道題要求多次壓縮,上一次壓縮的輸出要作為下一次壓縮的輸入。由於c語言本身的限制,我們定義字串(字元陣列)時要預先設定大小,並無法改變,所以本題必須弄清楚在極端情況下 n=40,字串的最大長度。經過測試可以得知最大值在七萬多,所以定義乙個100000長的字串完全就夠用了。
自己寫的遞迴版本
缺陷在於,由於定義的字串長度比較大,每次遞迴都要重新開乙個同樣大的新的陣列,所以比較浪費空間。
#include
#include
#include
char
*compress
(char
*str,
int n)
int m =
0,count=1;
char next[
100000];
char pre = str[0]
;for
(int i=
1;i<
strlen
(str)
;i++
)else
pre = str[i];}
next[m++
]= pre;
next[m++
]= count+
'0';
next[m]
='\0'
; str = next;
return
compress
(str,n-1)
;}intmain()
更好的迭代版本
出自大佬部落格
學到了乙個技巧:面對這種遞推性的,可以用兩個字串做儲存,交替地存放新產生的遞迴序列(str1,str2),用兩個指標(s1,s2)分別指向代表第k和第k+1個序列的字串,每一次迭代後交換兩個指標指向的字串。
s1指向str1,s2指向str2,s1作為輸入,s2作為輸出,此時輸出存在str2裡
遍歷s1,賦值s2;
交換s1,s2; (此時s1指向str2,作為新的輸入,s2指向str1,作為輸出)
轉2,直到迭代完成。
更詳細的解釋康康
#include
#include
intmain()
}char
*temp = s1;
s1 = s2;
s2 = temp;
}printf
("%s"
,s1)
;return0;
}
1084 外觀數列
1084 外觀數列 20 分 外觀數列是指具有以下特點的整數序列 d,d1,d111,d113,d11231,d112213111,它從不等於 1 的數字d開始,序列的第 n 1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個d,所以就是d1 第 2 項是 1 個d 對應d1 和 1...
1084 外觀數列
1084 外觀數列 20 分 外觀數列是指具有以下特點的整數序列 d,d1,d111,d113,d11231,d112213111,它從不等於 1 的數字d開始,序列的第 n 1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個d,所以就是d1 第 2 項是 1 個d 對應d1 和 1...
1084 外觀數列
1084 外觀數列 20 分 外觀數列是指具有以下特點的整數序列 d,d1,d111,d113,d11231,d112213111,它從不等於 1 的數字d開始,序列的第 n 1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個d,所以就是d1 第 2 項是 1 個d 對應d1 和 1...