藍橋杯 K-進位制數(簡潔 圖解)----------Five-菜鳥級
K-進位制數
題目描述
考慮包含N位數字的K-進位制數. 定義一個數有效, 如果其K-進製表示不包含兩連續的0.
考慮包含N位數字的K-進位制數. 定義一個數有效, 如果其K-進製表示不包含兩連續的0.
例:
1010230 是有效的7位數
1000198 無效
0001235 不是7位數, 而是4位數.
給定兩個數N和K, 要求計算包含N位數字的有效K-進位制數的總數.
假設2 <= K <= 10; 2 <= N; 4 <= N+K <= 18.輸入
兩個十進位制整數N和K
2
10
輸出
十進位制表示的結果
90
樣例輸入
樣例輸出
根據題意,要知道 N 位K 進位制並且 不能有連續兩個0出現 還有首位不能為0 的限制條件。
本著由簡到難的思想 :
假設是讓你求 1位 K 進位制的滿足條件的數,那麼滿足條件的數則有 1,2,3.....K-1 一共K-1個數對吧,
我們記作 res_1=K-1,那麼不滿足條件的數 只有 0 ,一共1個數 ,我們記作res_0=1。
假設是讓你求 2位 K 進位制的滿足條件的數,那麼先考慮首位(也就是第2位),可以填的數為除去0的其他數,
有 1,2,3.....K-1 一共K-1個數對吧,而這第二位可以填的數 可以和第一位的所有數搭配,
以1為例,有 11,12,13,.....1(K-1),還有在第一位不滿足條件的 0 搭配 10,也是滿足條件的數,
所以2位K進位制滿足條件的數res_1=(K-1)*(K-1+1),即 res_1=(K-1)*(res_1+res_0),對吧,
再來看不滿足條件的數 即 首位為0的 有 01,02,03.....0(K-1),一共有K-1個也就是res_0=K-1,即 res_0=res_1(上一個)。
第一位滿足條件的數res_1對吧,因為不能連0 ,雖然00也是不滿足,但是 00這種情況是絕對不滿足,
而首位不滿足的情況是相對不滿足,絕對和相對 懂吧。
那麼繼續,假設是讓你求 3位 K 進位制的滿足條件的數,同樣先考慮首位(也就是第3位),
可以填的數為除去0的其他數,有 1,2,3.....K-1 一共K-1個數對吧,而這第3位可以填的數
可以和2位K進位制滿足條件和(相對)不滿足條件的數搭配,即 res_1=(K-1)*[(K-1)*(K-1+1)+(K-1)],
即 res_1=(K-1)*(res_1+res_0),不滿足條件的數則是可以和2位K進位制滿足條件的數搭配,
res_0=(k-1)*(K-1+1),即res_0=res_1。
後面的位數就以此類推,再看看圖解。
AC程式碼:
#include<stdio.h>
int main()
{
int N,K,i,res_0,res_1;//res_1代表最高位非0 res_0代表最高位為0的結果
while(scanf("%d%d",&N,&K)!=EOF){
res_1=K-1,res_0=1;//如果只有一位時 K進位制首位為1的可以填的為K-1個數去掉為0
for(i=2;i<=N;i++){
int last_res_1=res_1;//暫存
res_1=(K-1)*(res_1+res_0);//如果高位為1 則結果為上一次結果為1和為0的數的個數
res_0=last_res_1; //如果高位為0 則結果為上一次結果為1的數的個數
}
printf("%d\n",res_1);
}
return 0;
}