这道题可以用 integer.string()求每个进制的数,但这里要每一位数相加,所以用这个方法会比较麻烦,如下
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int xy=1;
int k=1;
int number=0;
while (number<2023){
if(isxy(k)){
xy=k;
number++;
}
k++;
}
System.out.println(xy);
scan.close();
}
public static boolean isxy(int k){
String k_2=Integer.toString(k, 2);
String k_8=Integer.toString(k, 8);
String k_16=Integer.toString(k,16);
String k_10=Integer.toString(k,10);
return ishsd(k, k_2) && ishsd(k, k_8) && ishsd(k, k_16) && ishsd(k, k_10);
}
public static boolean ishsd(int k,String x){
int sum=0;//各位数之和;
for(int i=0;i<x.length();i++){
if((int)x.charAt(i)-59<=0){
sum=sum+(int)x.charAt(i)-48;
}else{
sum=sum+(int)x.charAt(i)-87;
}
}
return k % sum == 0;
}
}
所以这道题用其他的方法会更方便,如下
public class Main {
public static void main(String[] args) {
int cnt = 0;
for(int i=1; ; i++){
if(check(i, 2) && check(i, 8) && check(i, 10) && check(i, 16)) cnt++;
if(cnt == 2023){
System.out.println(i);
break;
}
}
}
//判断是否为mod进制下的哈沙德数
public static boolean check(int x, int mod){
int n = x;
int ans = 0;
while(x>0){
ans = ans+ x%mod;
x /= mod;
}
return n%ans==0;
}
}
就像十进制数对十取余一样,能取出这个十进制数的最后一位,如果再除以10,再取余就可以,这样循环就可以取出每一位上的数字,所以十进制数对2 8 16求余也能取出,2 8 16进制下的最后一位数。