k进制数

k-进制数

1.题目:

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

2.思路:

比如 n等于2 k = 10 表示2位10进制数 但是不能包含两个连续的0 问一共有多少种有效的数字

当为2为时 我们可以确定第一位 因为首位不能为0 所以可以从1-9 所以首位种数为(k-1) 为9

而第二个数可以为0 所以可以从0 - 9 一共有10种 两个数组合起来一共就有90种组合

当n = 1 有效数字为9种

当n = 2 有效数字为90种

当n = 3 有效数字为821种

通过上面我们发现一个规律就是当N大于2时 它的有效数字组合是前两项的和乘以(k-1)

因为当为3位时 首位我们是可以确定的 只有k-1位 而第二位可以为0 或者1

(1)当为0的时候 第三位必须为1 所以它的组合数就是 当n = 2 时候的组合数

(2)当为1的时候,第三位必须为0 所以它的组合数就是当 n= 1时候的组合数

所以n大于2的时候 我们只需要把前两项和加起来乘(k-1)

3.具体代码实现(java)

(1)用数组做法

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int [] arr = new int[n+1];
for(int i = 1 ; i <arr.length;i++) {
if(i == 1) {
arr[i] = k - 1;//当为一位的时候首位又不能为0 所以只有1-9 一共9个有效数字
} else if(i==2) {
arr[i] = k*(k-1);//首位是(k-1)为 当k = 10 时 第一位就是9种 而第二位可以是从0到9 一共10种 所以一共就有90 种有效数字
} else {
arr[i] =( arr[i-1]+arr[i-2])*(k-1);//当n大于2时 有效数字时前两项之和乘首位总和 9
}
}
System.out.println(arr[n]);
}

(2)我们可以用递归

public static int K(int n ,int k) {
if(n == 1) {
return (k-1) ;
} else if(n==2) {
return k*(k-1);
} else {
return (K(n-1,k)+K(n-2,k))*(k-1);
}

}

4.联系方式

qq:2061302791

微信:xie2061302791

电话:15284524485

个人网站:https://xieyingpeng.github.io/

Github:https://github.com/xieyingpeng/

博客园:https://www.cnblogs.com/Xieyingpengz

知乎:https://www.zhihu.com/people/nan-qiao-12-73

gitee:https://gitee.com/xie-yingpeng/project-1.git

bilibili:https://space.bilibili.com/617198338?share_medium=android&share_source=copy_link&bbid=XY2BDF522C748A159BE7DD354D6DFFB963728&ts=1612520115798