由題可知就是要求計算一個數字,可以整除10進制的每一位,亦可以整除8進制和16進制的每一位。要求找出第2023個能夠在三個進制下同時被10進制整除的數字。
Java中已經封裝了進制轉換的方法,以下是一些常用的轉換方法:👇
-
十進制轉二進制:?int n = 18; String binaryString = Integer.toBinaryString(n); System.out.println(n + "的二進制是:" + binaryString);
-
十進制轉八進制:?String octalString = Integer.toOctalString(n); System.out.println(n + "的八進制是:" + octalString);
-
十進制轉十六進制:?String hexString = Integer.toHexString(n); System.out.println(n + "的十六進制是:" + hexString);
-
十進制轉任意進制:?String base3String = Integer.toString(n, 5); System.out.println(n + "的五進制是:" + base3String);
我們可以從1開始尋找合適的數字,使用String轉換為對應字符串截取每一位轉換成int類型的值進行比較,但是這樣顯然太麻煩要做很多次的判斷和比較。我們考慮直接模擬對應的方法使用一個函數獲取每一位的值并且直接返回int類型。使用我們常用的十進制截取來比例:
static int fn1(int num) {//獲取每一位的值int ans=0;while (num>0) {ans+=num%10;num/=10;}return ans;}
即將傳進來的參數進行判斷,每次對10取余就是個位上的值,取到個位上的值再用除法將個位去掉,依次進行。那么十進制除以10對十取余,我們只需要將10改為變量即可。
解題代碼👇
static int fn1(int num,int k) {//獲取每一位的值int ans=0;while (num>0) {ans+=num%k;num/=k;}return ans;}static boolean check(int x){//判斷是否符合題意if (x%fn1(x, 2)==0 && x%fn1(x, 8)==0 && x%fn1(x, 10)==0 && x%fn1(x, 16)==0) {return true;}else {return false;}}public static void main(String[] args) {int count=2023;//從2023遞減int i=1;//從1開始while (count>0) {if (check(i++)) {count--;}}System.out.println(i);}
代碼留下了一個BUG,你能不能找出來是哪里有問題?? ? ? ??