时间限制: 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
输出
十进制表示的结果
样例输入
2
10
样例输出
90
Codes&Analysis
Code 1 Right
思路:
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<stdio.h>
#include<string.h>
#define N 20
int ar[N]={
0};
//对n位二进制进行增一处理,并统计出现1的次数,
//返回值:如果出现两个连续的0,则返回0;如果第n+1位不为0,则不是n位二进制,返回-1;否则返回统计的次数
int AddOne(int n)
{
if(ar[n]!=0) return -1;
int i,cnt;
ar[0]++;
for(i=0;i<n;i++){
if(ar[i]>1){
ar[i+1]+=ar[i]/2;
ar[i]%=2;
}
}
cnt=0;
for(i=0;i<n-1;i++){
if(ar[i]!=0) cnt++;
else if(ar[i+