这道题可以用 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进制下的最后一位数。