[英]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.