由题可知就是要求计算一个数字,可以整除10进制的每一位,亦可以整除8进制和16进制的每一位。要求找出第2023个能够在三个进制下同时被10进制整除的数字。
Java中已经封装了进制转换的方法,以下是一些常用的转换方法:👇
-
十进制转二进制: int n = 18; String binaryString = Integer.toBinaryString(n); System.out.println(n + "的二进制是:" + binaryString);
-
十进制转八进制: String octalString = Integer.toOctalString(n); System.out.println(n + "的八进制是:" + octalString);
-
十进制转十六进制: String hexString = Integer.toHexString(n); System.out.println(n + "的十六进制是:" + hexString);
-
十进制转任意进制: String base3String = Integer.toString(n, 5); System.out.println(n + "的五进制是:" + base3String);
我们可以从1开始寻找合适的数字,使用String转换为对应字符串截取每一位转换成int类型的值进行比较,但是这样显然太麻烦要做很多次的判断和比较。我们考虑直接模拟对应的方法使用一个函数获取每一位的值并且直接返回int类型。使用我们常用的十进制截取来比例:
static int fn1(int num) {//获取每一位的值int ans=0;while (num>0) {ans+=num%10;num/=10;}return ans;}
即将传进来的参数进行判断,每次对10取余就是个位上的值,取到个位上的值再用除法将个位去掉,依次进行。那么十进制除以10对十取余,我们只需要将10改为变量即可。
解题代码👇
static int fn1(int num,int k) {//获取每一位的值int ans=0;while (num>0) {ans+=num%k;num/=k;}return ans;}static boolean check(int x){//判断是否符合题意if (x%fn1(x, 2)==0 && x%fn1(x, 8)==0 && x%fn1(x, 10)==0 && x%fn1(x, 16)==0) {return true;}else {return false;}}public static void main(String[] args) {int count=2023;//从2023递减int i=1;//从1开始while (count>0) {if (check(i++)) {count--;}}System.out.println(i);}
代码留下了一个BUG,你能不能找出来是哪里有问题?