这是我一个网站上做题的解析https://blog.dotcpp.com/a/78858
原题链接:K-进制数
(1)k-进制:就是长度>2的数字不能以0开头,而且中间的数字不能有两个连续的0
(2)接下来就是在指定的数字范围内寻找 k-进制
,这个指定范围嘞就是n长度,k进制来指定的,n,k咋描述呢,就是长度=n,是k进制的一个数。比如:n = 2,k=10的时候,就是长度=2的数,而且这个数是10进制的数字。所以,这个数的范围就是10-99。
2、制定方案
(1)思路:这里我的想法是把数字一个一个的列出来,然后再寻找满足条件的数字,再进行统计。
(2)问题1:那怎么把数字一个一个的列出来勒,那就是加法啊,比如n=2,k=10,范围是10-99,那我每次+1,是不是可以把10-99的数字全部列出来,那这里把数字一个一个的列出来已经有思路勒,就是+1。
(3)问题2:那还有一个问题就是:进制的范围是 2 <= k <= 10
啊,怎么+1啊。这个好办,我们10进制是不是从0开始数,然后是逢10进1,那2
进制就是逢2进1,3进制就是逢3进1。计算的问题就这样解决了。(4)问题3:那我怎么把+1之后的结果保存起来,这个就可以用一个Int数组了。前面不是声明了数字的长度了嘛,然后这个数字的长度就可以是数组的长度了,数组的最后一个是个位…
3、算法的退出条件:当数字准备从n位 变成 n+1的时候就是结束了。
4、isFull()这个方法是判断数字是否还在n长度的范围内,add()这个是+1,kBaseSystem()判断该数字是否是 k-进制数
public Main{
private static int count = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int baseSystem[] = new int[n];
if (n > 1) baseSystem[0] = 1;
base(baseSystem,k);
System.out.println(count);
}
public static void base(int base[],int sys){
while (!isFull(base,sys)){
add(base,sys);
}
}
public static boolean isFull(int base[],int sys){
if (kBaseSystem(base)){
count++;
}
for (int i = 0; i < base.length; i++) {
if (base[i] != (sys-1)) return false;
}
return true;
}
public static void add(int base[],int sys){
int remainder = -1,index = base.length-1;
do{
if (index > -1){
base[index] += 1;
remainder = base[index] % sys;
base[index] = remainder;
if (remainder == 0){
index--;
}
}
}while (remainder == 0);
}
public static boolean kBaseSystem(int base[]){
//如果规定k-进制的数只有一位数,那么返回true
if (base.length > 1 && base[0] == 0) return false;
int count = 0;
for (int i = 0; i < base.length; i++) {
if (base[i] == 0){
count++;
if (count > 1) return false;
}else {
count = 0;
}
}
return true;
}
}