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]);
}
}
添加回答
举报