下面是我的代码。
package com.ofss.java.examples;
import java.util.Scanner;
class ArmstrongNumber {
public static void main(String[] args) {
int c = 0, a;
int n1, n2;//Range in which armstrong number need to find
Scanner s = new Scanner(System.in);
System.out.println("Enter the first number");
n1 = s.nextInt();
System.out.println("Enter the second number");
n2 = s.nextInt();
for (int i = n1; i <= n2; ++i) {
while (i > 0) {
a = i % 10;
System.out.println(a);
i = i / 10;
System.out.println(i);
c = c + (a * a * a);
System.out.println(c);
}
if (i == c)
System.out.println(c + "armstrong number");
else
System.out.println(c + "Not armstrong number");
}
}
}
...是一个数字,它是其自己的数字之和,每个数字之和等于数字的幂。
答案 0 :(得分:1)
您不应该更改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
与 Wikipedia 相同:
以10为底的自恋数字的序列开始:0、1、2、3、4、5、6、7、8、9、153、370、371、407、1634、8208、9474,... < / p>
请注意,使用这种方法可以避免忘记重置变量的风险,例如c
。更正此错误将使您获得更多“正确”的结果(以及3位数字的结果)
您还可以使用较少的数学来读取数字并使用char[]
,请记住,您需要减去'0'
值以获得字符的数值:
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;
}
答案 1 :(得分:0)
有两件事。
您每次在使用i时都在更新i,因此请使用不同于i的变量进行计算。
int num = i;
c用于比较与数字相同的多维数据集的总和,但是一次迭代结束后,您无需重置它。因此在循环内部使c = 0。
c = 0;
另外,在打印时使用c时,应该有i,它是正确的实数。
下面是您可以尝试的工作代码。
public static void main(String[] args)
{
int c = 0, a;
int n1, n2;//Range in which armstrong number need to find
Scanner s = new Scanner(System.in);
System.out.println("Enter the first number");
n1 = s.nextInt();
System.out.println("Enter the second number");
n2 = s.nextInt();
for (int i = n1; i <= n2; ++i)
{
int num = i;
while (num > 0)
{
a = num % 10;
num = num / 10;
c = c + (a * a * a);
}
if (i == c)
System.out.println(i + "armstrong number");
else
System.out.println(i + "Not armstrong number");
c = 0;
}
}
答案 2 :(得分:-2)
公共类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]);
}
}
答案 3 :(得分:-2)
您的代码中有很多需要改进的地方。工作逻辑之一如下:
for (int i = n1; i <= n2; ++i) {
int sum = 0, remainder = 0, digits = 0, temp = 0;
temp = i;
while (temp != 0) {
digits++;
temp = temp / 10;
}
temp = i;
while (temp != 0) {
remainder = temp % 10;
sum = sum + (int) Math.pow(remainder, digits);
temp = temp / 10;
}
if (i == sum)
System.out.println(i + " is an Armstrong number.");
else
System.out.println(i + " isn't an Armstrong number.");
}