哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。
例如126是十进制下的一个哈沙德数,因为(126)1o mod (1+2+6)=0; 126也是八进制下的哈沙德数,因为(126)10= (176)s,(126)10 mod (1+7+6)一0;同时126也是16进制下的哈沙德数,因为(126)10 = (7e)16,(126)1o mod (7+e)=0。
小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为哈沙德数,那么这个数字就是幸运数字,第1至第10个幸运数字的十进制表示为:1,2,4,6,8,40,48,72,120,126…。
现在他想知道第2023个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
215040
Java中的进制转换函数
Integer.toString
可以将一个整数转换为指定进制的字符串表示形式。
该函数的用法如下:
public static String toString(int value, int radix)
其中,value是要转换的整数,radix是目标进制。
public class Main{
public static void main(String[] args) {
int cnt = 0;// 哈沙德数的个数
int num = 0;//幸运数
while (cnt < 2023) {
num++;
// 计算二进制
String s1 = Integer.toString(num, 2);
if (num % sum(s1) == 0) {
// 对二进制数的数位之和取余数为0
// 计算八进制
String s2 = Integer.toString(num, 8);
if (num % sum(s2) == 0) {
// 对八进制数的数位之和取余数为0
// 计算十进制
if (num % sum(num) == 0) {
// 对十进制数的数位之和取余数为0
// 计算十六进制
String s3 = Integer.toString(num, 16);
if (num % sum(s3) == 0) {
// 对十六进制数的数位之和取余数为0
cnt++;
}
}
}
}
} // while
//输出
System.out.println(num);//215040
}
// 计算一个数的各位之和的函数:计算二进制,八进制,十六进制的情况
public static int sum(String string) {
int sum = 0;
for (int i = 0; i < string.length(); i++) {
//进行字母串切割,由ASCII码计算具体的数位值
if (string.charAt(i) >= '0' && string.charAt(i) <= '9') {
sum += (string.charAt(i) - '0');
} else {
// 16进制中的a~e对饮10~15
sum += (string.charAt(i) - 'a' + 10);
}
}
return sum;
}
// 计算一个数的各位之和的函数:重载方法,用于计算十进制的情况
public static int sum(int n) {
int sum = 0;
while (n != 0) {
sum += n % 10;//取个位数累加
n /= 10;//原数除十
}
return sum;
}
}