1. 程式人生 > >藍橋杯 K-進位制數(簡潔 圖解)----------Five-菜鳥級

藍橋杯 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;
}