問題 1117 K 進製數 Right

2021-10-03 02:03:29 字數 2089 閱讀 6336

時間限制: 1sec 記憶體限制: 128mb

考慮包含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

輸出

十進位制表示的結果

樣例輸入210

樣例輸出

90思路:

k-進製數滿足兩個條件:1. 不能出現兩個連續的0   2.必須是合法的n位數

只要保證n位k進製數不出現連續的0,最高位不是0,就滿足這兩個條件

因為k進製數某一位不是0的情況下共有k-1種可能,所以直接簡化為2進製。對二進位制進行討論。

迴圈主體:對n位二進位制進行增一運算,尋找在滿足條件的情況下,1出現的次數。

迴圈結束條件:n位二進位制增一后,變為n+1位二進位制,即第n+1位不為0

bug當僅有兩位數的時候,因為首位已經討論,僅剩下一位,有k種可能,但是因為尋找的是出現1的次數,所以會將最後一位為0的情況(這種情況滿足條件)捨去,所以應該在總次數的情況下增加k-1種可能。

#include

#include

#define n 20

int ar[n]=;

//對n位二進位制進行增一處理,並統計出現1的次數,

//返回值:如果出現兩個連續的0,則返回0;如果第n+1位不為0,則不是n位二進位制,返回-1;否則返回統計的次數

intaddone

(int n)

} cnt=0;

for(i=

0;i1;i++

)return cnt;

}int

pow(

int a,

int b)

intmain()

if(n==

2) cnt+

=k-1

;printf

("%d\n"

, cnt);}

return0;

}

首先,首位不能為0,共有k-1中選擇,其他位(n-1位)滿選,共有kn−

1k^

kn−1

種情況。這樣最多有(k−

1)∗k

n−

1(k-1)*k^

(k−1)∗

kn−1

種情況然後排除存在兩個甚至多個零在一起的情況。

從兩個零在一起開始遞增,最多有n-1(n>=3)個零在一起。

兩個零:(k−

1)∗(

n−2)

∗(k−

1)n−

3(k-1)*(n-2)*(k-1)^

(k−1)∗

(n−2

)∗(k

−1)n

−3三個零:(k−

1)∗(

n−3)

∗(k−

1)n−

4(k-1)*(n-3)*(k-1)^

(k−1)∗

(n−3

)∗(k

−1)n

−4…n-1個零:(k−

1)∗1

∗(k−

1)

0(k-1)*1*(k-1)^

(k−1)∗

1∗(k

−1)0

按照上面的思路寫出的**為:

但是這**測試的時候是錯誤的,不清楚是什麼原因。

#include

intpowint

(int a,

int b)

intmain()

測試:5 2

輸出:10

正確輸出:8

缺少情況:10100 10010

不能保證2~n-3的這種情況的完整性!

問題 1117 K 進製數

考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.例 1010230 是有效的7位數 1000198 無效 0001235 不是7位數,而是4位數.給定兩個數n和k,要求計算包含n位數字...

題目 1117 K 進製數

題目的意思就乙個n位的k進製數中不能有2個及2個以上的0是相鄰的,問這樣的數一共有多少個 首位肯定不能為0,前面的數如果為0則後面的數可以是除了0以外的任意數,前面的數如果不為0則後面的數就可以為任意值。實現只不過是模擬上面的過程,用乙個標記指示某一位是不是為0,如果前一位是0,那當前這位就一種情況...

題目 1117 K 進製數

考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.考慮包含n位數字的k 進製數.定義乙個數有效,如果其k 進製表示不包含兩連續的0.例 1010230 是有效的7位數 1000198 無效 0001235 不是7位數,而是4位數.給定兩個數n和k,要求計算包含n位數字...