找出数字之间的阿姆斯壮数字

时间:2018-08-29 05:26:18

标签: java numbers

下面是我的代码。

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");

        }
    }
}
  1. 执行后,我得到的结果不正确。代码运行无限数,直到您停止它为止。它必须打印151-154之间的数字(153为Armstrong)。
  2. 此外,它错误地将153打印为非Armstrong号码。

Armstrong Number

  

...是一个数字,它是其自己的数字之和,每个数字之和等于数字的幂。

4 个答案:

答案 0 :(得分:1)

您不应该更改i,因为它也在

中使用
for (int i = n1; i <= n2; ++i) 

或者您可能永远不会退出循环迭代器,因为您期望i在第一次迭代结束时为负。在达到n2之前很难增加。

使用其他变量来安全地跟踪i

    int j = i;
    while(j > 0) ...

关于Armstrong number

  

阿姆斯壮数是一个数字,该数字是其自己的数字之和,每个数字之和等于数字的幂次。

您需要将每个数字置于数字长度的幂(数字位数)上。

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)

有两件事。

  1. 您每次在使用i时都在更新i,因此请使用不同于i的变量进行计算。

    int num = i;

  2. 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.");
}