问题描述
哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如 126126 是十进制下的一个哈沙德数,因为 (126)10mod(1+2+6)=0(126)10mod(1+2+6)=0;126126 也是八进制下的哈沙德数,因为 (126)10=(176)8(126)10=(176)8 ,(126)10mod(1+7+6)=0(126)10mod(1+7+6)=0;同时 126126 也是 1616 进制下的哈沙德数,因为 (126)10=(7e)16(126)10=(7e)16 ,(126)10mod(7+e)=0(126)10mod(7+e)=0。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为哈沙德数,那么这个数字就是幸运数字,第 11 至第 1010 个幸运数字的十进制表示为:1,2,4,6,8,40,48,72,120,126…1,2,4,6,8,40,48,72,120,126…。现在他想知道第 20232023 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
ps:解题代码非原创,来自 “yc” ,本文仅提供思路讲解和易错点提示
//首先通过问题分析,将代码分为遍历和判断两部分
public class test {
public static void main(String[] args) {
int a=0;//定义一个数用于接收是第几个幸运数字
for (int i = 1; ; i++) {//空出条件实现无限循环
if(chack(i, 2)&&chack(i, 8)&&chack(i, 10)&&chack(i, 16)) {//调用定义的方法检查i是否为幸运数字
a++;//是,幸运数字个数加一
}
if(a==2023) {//如果为第2023个
System.out.println(i);
break;//退出循环
}
}
}
//定义一个方法用于检查i是否为幸运数字
//1.确认返回值(boolean)2.确认参数(i即为待确认数字,mod就是 是几进制)
public static boolean chack(int i,int mod) {
int nc=0;//定义一个数接收余数和
int c=i;//i会在下面的循环中改变,所以定义一个数代替i用于最后的判断
while (i>0) {//得出i的余数和
nc=nc+i%mod;
i=i/mod;
}
return c%nc==0;//判断是否为幸运数字
}
}
这个解法的核心思路就是进制的准换来获取转换后的每一位数,原理可看
http://t.csdnimg.cn/4c4xu(进制准换方法)