java k-进制 暴力破解 详细解答

这是我一个网站上做题的解析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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值