PAT Basic 1084 外觀數列

2021-09-26 13:33:44 字數 1978 閱讀 4958

外觀數列是指具有以下特點的整數序列:

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...