簡體   English   中英

Java 中的阿姆斯壯編號檢查器

[英]Armstrong Number Checker in Java

我仍然是 Java 的初學者,但我的代碼需要幫助。 我想寫一個阿姆斯壯數字檢查器。

阿姆斯特朗數是一個數字之和,其三的冪等於數字本身。 例如,371 是阿姆斯壯數,因為 3^3 + 7^3 + 1^3 = 371。

如果我正確理解了這個概念,那么我的代碼應該可以正常工作,但我不知道我在哪里犯了錯誤。 如果您能幫助糾正我的錯誤,我將不勝感激,但仍然堅持我對問題的解決方案,除非我的嘗試完全錯誤或大部分需要更改。

這是代碼:

public class ArmstrongChecker {
    
     boolean confirm = false;
     Integer input;
     String converter;
     int indices;
     int result = 1;
    
     void ArmstrongCheck(Integer input) {
        this.input = input;
        converter = input.toString();
        char[] array = converter.toCharArray();
        indices = array.length;
        result = (int) Math.pow(array[0], indices);
        
        for (int i = 1; i < array.length; i++) {
            result = result + (int) Math.pow(array[i], indices);
        }
        if (result == input) {
            confirm = true;
            System.out.println(confirm);
        } else {
            System.out.println(confirm);
        }
    }
}

對於我的嘗試,我使用“153”作為輸入。 謝謝您的幫助!

您不是對數字求和,而是對代表它們的字符的數值求和。 您可以通過減去字符'0'將此類字符轉換為其數值:

int result = 0;
for(int i = 0; i < array.length; i++) {
    result = result + (int) Math.pow(array[i] - '0', indices);
}

話雖如此,可以說(可能?)將輸入讀取為實際的int數字並通過在每次迭代中獲取10的提醒來迭代其數字更優雅。 位數本身可以使用以 10 為底的對數來計算。

int temp = input;
int result = 0;
int indices = (int) Math.log10(10) + 1;
while (temp != 0) { 
    int digit = temp % 10;
    result += (int) Math.pow(digit, indices);
    temp /= 10;
}

您的代碼中有一個小邏輯錯誤,您沒有將字符轉換為 integer 而是您正在做類似的事情

Math.pow('1', 3) -> Math.pow(49, 3) // what you're doing

Math.pow(1, 3) // what should be done

您應該首先使用以下任何方法將字符轉換為字符串

result = (int) Math.pow(array[0],indices);

for(int i = 1;i<array.length;i++) {
     result = result + (int) Math.pow(array[i],indices);
}

用於將 char 轉換為 integer

int x = Character.getNumericValue(array[i]);

或者

int x = Integer.parseInt(String.valueOf(array[i])); 

或者

int x = array[i] - '0'; 

或者

您還可以使用以下邏輯檢查 Armstrong 的號碼,無需任何轉換

public class Armstrong {
    public static void main(String[] args) {

        int number = 153, num, rem, res = 0;
        num = number;

        while (num != 0)
        {
            rem = num % 10;
            res += Math.pow(rem, 3);
            num /= 10;
        }

        if(res == num)
            System.out.println("YES");
        else
            System.out.println("NO");
    }
}

對於任何正整數,您都可以這樣做。

打印所有小於 10_000 的 Armstrong 數字。

for (int i = 1; i < 10_000; i++) {
    if (isArmstrong(i)) {
        System.out.println(i);
    }
}

印刷

1
2
3
4
5
6
7
8
9
153
370
371
407
1634
8208
9474

關鍵是使用Math.log10來計算候選號的位數。 這必須通過添加 1 來修改。所以Math.log10(923)返回2.965201701025912 轉換為int並添加1將是3 digits 那么位數就是用於計算的功率。

然后,只需將提升到該冪的數字相加即可。 如果在處理所有數字之前總和超過了數字,則該方法會短路並返回false

    
public static boolean isArmstrong(int v) {
    if (v < 1) {
        throw new IllegalArgumentException("Argument must > 0");
    }
    
    int temp = v;
    int power = (int)Math.log10(temp)+1;
    int sum = 0;
    
    while (temp > 0) {
        sum += Math.pow(temp%10, power);
        
        if (sum > v) {
           return false;
        }

        temp/= 10;
    }
    
    return v == sum;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM