3 回答

TA貢獻1744條經驗 獲得超4個贊
您不應該更改,i因為這也用于
for (int i = n1; i <= n2; ++i)
或者您可能永遠不會退出該循環,因為您希望i在第一次迭代結束時為負。很難增加直到達到n2。
使用不同的變量來i安全地跟蹤。
int j = i;
while(j > 0) ...
關于阿姆斯壯數:
阿姆斯特朗數是一個數,它是它自己的數字之和,每個數字都增加到數字的冪次方
您需要將每個數字的數字長度(數字的數量)的冪。
153 = 1^3 + 5^3 + 3^3
1634 = 1^4 + 6^4 + 3^4 + 4^4
這是它的方法:
public static boolean isArmstrongNumber(int number){
int power = Integer.toString(number).length(); //just to get the number of digit...
int tmp = number;
int digit , sum = 0;
while(tmp > 0){
digit = tmp % 10;
sum += Math.round(Math.pow(digit , power));
tmp /= 10;
}
return sum == number;
}
使用這個從 0 到 10.000 的檢查給出:
0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474
與維基百科相同:
自戀數字的基數為 10 的序列開始:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, ...
請注意,使用方法可以消除c在您的情況下忘記重置變量的風險。糾正這個會給你更多“正確”的結果(以及 3 位數的結果)
您還可以使用 less 數學來讀取數字并使用char[],請記住,您需要減去'0'value 才能獲得字符的數值:
public static boolean isArmstrongNumber(int number){
char[] digits = Integer.toString(number).toCharArray();
int power = digits.length;
int sum = 0;
for(char c : digits){
int digit = c - '0';
sum += Math.round(Math.pow(digit, power));
}
return sum == number;
}

TA貢獻1847條經驗 獲得超7個贊
公共類 ArmstrongNumber {
private final int n1, n2;
public ArmstrongNumber(int n1, int n2) {
this.n1 = n1;
this.n2 = n2;
}
protected static boolean isArmstrong(int n) {
if(n < 0)
return false;
int remaining=n;
int sumCube=0;
while (remaining>0) {
int d = remaining % 10;
sumCube += cube(d);
remaining /= 10;
}
return n == sumCube;
}
private static int cube(int d) {
return d*d*d;
}
public Integer[] find() {
List<Integer> results = new ArrayList<>();
for (int i = n1; i <= n2; ++i)
{
if (isArmstrong(i))
results.add(i);
}
return results.toArray(new Integer[0]);
}
}
添加回答
舉報