時間限制: 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位數字...