平凡


私信TA

用户名:uq_30153938431

访问量:7845

签 名:

等  级
排  名 949
经  验 3251
参赛次数 0
文章发表 16
年  龄 20
在职情况 学生
学  校 广西建设职业技术学院
专  业 网络技术

  自我简介:

已经升本了。

解题思路: 1、理解题目

                     (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;
    }
}
 

0.0分

4 人评分

  评论区