问题描述:
哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如126是十进制下的一个哈沙德数,因为(126)10 mod(1+2+6)=0;126 也是八进制下的哈沙德数,因为(126)10 =(176)8(126)10 mod (1+7+6)=0;同时126 也是16 进制下的哈沙德数因为(126)10 =(7e)16,(126)10 mod (7+)=0。小蓝认为,如果个整数在二进制、八进制、十进制、十六进制下均为哈沙德数,那么这个数字就是幸运数字,第1至第10个幸运数字的+进制表示为:1,2,4,6,8,40,48,72,120,126 ....。现在他想知道第2023 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
代码实现:
import java.util.Scanner;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
//i为幸运数字十进制结果 counter为第几个幸运数字
int i = 1, counter = 0;
while(true) {
//1.进制转化2.转换为字符串类型
String bin = Integer.toBinaryString(i);
String oct = Integer.toOctalString(i);
String dec = String.valueOf(i);//本身就是10进制,直接转换成字符串类型
String hex = Integer.toHexString(i);
//各进制和
int binSum = sum(bin, 2);
int octSum = sum(oct, 8);
int decSum = sum(dec, 10);
int hexSum = sum(hex, 16);
//判断是否是幸运数字,是counter++
if(i % binSum == 0 && i % octSum == 0 && i % decSum == 0 && i % hexSum == 0) {
counter++;
}
if(counter >= 2023) {
System.out.println(i);
break;//counter >= 2023 结束循环,输出i
}
i++;
}
}
//sum()方法:储存各进制之和
private static int sum(String numStr, int radix) {
BigInteger ret = new BigInteger("0", radix);
for(int i1 = 0; i1 < numStr.length(); i1++) {
String s = numStr.substring(i1, i1+1);
BigInteger bn = new BigInteger(s, radix);
ret = ret.add(bn);
}
return ret.intValue();
}
}