解题思路: 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分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复