簡體   English   中英

Java任意數字的阿姆斯特朗號

[英]Java any digit Armstrong number

以下是我獲得三位數阿姆斯特朗編號的代碼:

public class test {

    public static void main(String args[]) {

        for (int i = 100; i <= 999; i++) {
            int firstDigit = (i / 100);
            int secondDigit = (i % 100) / 10;
            int thirdDigit = (i % 10);
            if ((firstDigit * firstDigit * firstDigit)
                    + (secondDigit * secondDigit * secondDigit)
                    + (thirdDigit * thirdDigit * thirdDigit) == i) {

                System.out.println("this is a armstriong number - " + i);
            }
        }
    }
}

我試圖根據用戶輸入獲得任何數字的阿姆斯特朗,但最終卻寫了太多的循環和多余的代碼。

以下代碼檢查(在控制台上)掃描的號碼是否是阿姆斯特朗號碼。 我已經測試過了,它工作正常。

控制台測試

import java.util.Scanner;

class ArmstrongNumber
{
   public static void main(String args[])
   {
      int n, sum = 0, temp, remainder, digits = 0;

      Scanner in = new Scanner(System.in);
      System.out.println("Input a number to check if it is an Armstrong number");      
      n = in.nextInt();

      temp = n;

      // Count number of digits

      while (temp != 0) {
         digits++;
         temp = temp/10;
      }

      temp = n;

      while (temp != 0) {
         remainder = temp%10;
         sum = sum + power(remainder, digits);
         temp = temp/10;
      }

      if (n == sum)
         System.out.println(n + " is an Armstrong number.");
      else
         System.out.println(n + " is not an Armstrong number.");         
   }

   static int power(int n, int r) {
      int c, p = 1;

      for (c = 1; c <= r; c++) 
         p = p*n;

      return p;   
   }
}

來源在這里


有功能

如果需要將其用作功能,請嘗試此操作。 n參數是您要檢查的數字。 如果我的函數是Armstrong數,則返回true,否則返回false。

public boolean isArmstrongNumber(int n) {
    int sum = 0, temp = n, remainder, digits = 0;
    while (temp != 0) {
         digits++;
         temp = temp/10;
      }

      temp = n;

      while (temp != 0) {
         remainder = temp%10;
         sum = sum + power(remainder, digits);
         temp = temp/10;
      }
      if (n == sum) //Armstrong number
          return true;
       else //Not Armstrong number
          return false;
}

只需更改arm_num最大值,您將獲得介於0到arm_num之間的Armstrong數

for(int arm_num = 0 ; arm_num < 100000 ; arm_num++)
        {
            String[] data = String.valueOf(arm_num).split("(?<=.)");
            int lngth = String.valueOf(arm_num).length();

            int arm_t_num = 0;

            int ary[] = new int[lngth];

            for(int i = 0 ; i < lngth ; i++)
            {
                ary[i] = Integer.parseInt(data[i]);

                for(int x = 0 ; x < lngth-1 ; x++)
                {
                    ary[i] = ary[i] * Integer.parseInt(data[i]);
                }

                arm_t_num+=ary[i];
            }

            if(arm_num == arm_t_num)
            {
                System.out.println("Number is ArmStrong : "+arm_num);
            }
        }

請嘗試使用以下方法

public static Boolean isArmstrongNumber(int number) {
    int n = number;
    List<Integer> lst = new ArrayList<Integer>();

    // to find digit and putting in list
    while (number > 0) {
        lst.add(number % 10);
        number = number / 10;
    }

    Long sum = 0L;
    for (Integer integer : lst)
        sum += (Long) Math.round(Math.pow(integer, lst.size()));
    return sum.intValue() == n ? true : false;
}

使用Java8,您可以創建一個IntStream來生成Armstrong編號。

第一步可能是創建一個函數來驗證數字是否為阿姆斯特朗數字:

public class ArmstrongNumbersGenerator {    

    // Get the next n armstrong numbers starting at a given number         
    public static int[] get(int start, int count) {         
        return IntStream.iterate(start, i -> i + 1)
            .filter(ArmstrongNumbersGenerator::isArmstrongNumber)
            .limit(count)
            .toArray();
    }

    // Get all the armstrong numbers in a given range
    public static int[] inRange(int start, int end) {
        return IntStream.range(start, end)
                .filter(ArmstrongNumbersGenerator::isArmstrongNumber)
                .toArray();
    }

    // Validate if a number is a armstrong number
    public static boolean isArmstrongNumber(int number) {
        int remainingDigits = number;
        int cubesTotal = 0;
        while(remainingDigits > 0) {
            int currentDigit = remainingDigits % 10;
            remainingDigits = remainingDigits / 10;
            cubesTotal += currentDigit * currentDigit * currentDigit;
        }
        return cubesTotal == number;
    }
}

用法示例:

System.out.println(Arrays.toString(ArmstrongNumbersGenerator.inRange(0, 10_000)));
Output: [0, 1, 153, 370, 371, 407]

System.out.println(Arrays.toString(ArmstrongNumbersGenerator.get(200, 2)));
Output: [370, 371] 

我編寫了一個程序來獲取110_000_000之間的所有Armstrong編號,這些代碼已經在Code Review上進行了審查。 以下是根據我在那里收到的建議使用查找阿姆斯壯編號的極簡實現:

IntStream.range(1, 10_000_000)
            .filter((n) -> {
                final String number = Integer.toString(n);
                return number.chars()
                    .mapToDouble(v -> Math.pow(v - '0', number.length()))
                    .sum() == n;
            }).forEach(System.out::println);

輸出:

1
2
3
4
5
6
7
8
9
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315

鏈接到評論問題:


不是解決問題的快速方法。 您可以使用並行來減少執行時間。 唯一的缺點是最終輸出將不按順序排列。

IntStream.range(1, 10_000_000)
            .parallel()    // For reducing execution time.
            .filter((n) -> {
                final String number = Integer.toString(n);
                return number.chars()
                        .mapToDouble(v -> Math.pow(v - '0', number.length()))
                        .sum() == n;
            }).forEach(System.out::println);

輸出:

1741725
9800817
9926315
1
2
3
4
5
6
7
8
9
153
370
371
407
1634
8208
9474
54748
92727
93084
4210818
548834

以下是針對110_000的給定范圍的卡尺測試報告:

 0% Scenario{vm=java, trial=0, benchmark=Parallel} 1933923.45 ns; ?=119465.91 ns @ 10 trials
50% Scenario{vm=java, trial=0, benchmark=Normal} 6161598.59 ns; ?=29084.33 ns @ 3 trials

benchmark   ms linear runtime
 Parallel 1.93 =========
   Normal 6.16 ==============================

嘗試使用此代碼,U甚至可以要求用戶輸入數字以測試Armstrong。

class Test{  
  public static void main(String[] args)  {  
    int c=0,a,temp;  
    Scanner scn = new Scanner(System.in);
  //It is the number to check armstrong
    System.out.println("Enter the number to check");
    int n=scn.nextInt();  

    temp=n;  
    while(n>0)  
    {  
    a=n%10;  
    n=n/10;  
    c=c+(a*a*a);  
    }  
    if(temp==c)  
    System.out.println("armstrong number");   
    else  
        System.out.println("Not armstrong number");   
   }  
}  

我認為我的解決方案更容易...

int n = in.nextInt();
for(int i = 10; i<=n; i++){
    int x=i; sum = 0;
    while(x>0){
      sum+ = (x%10)(x%10)(x%10);
      x/=10;
}
if(sum==i)
System.out.println(i+" ");
}

您只需要提供一個極限值,下面的程序將搜索從1到Limit的所有Armstrong數。

    int sum =0, tenspower =1;
    Int limit =1000000001;

    int arr[] = new int[10];


    for (int i=1;i<limit;i++){
        String[] str = String.valueOf(i).split("");


        for(int k=0; k< str.length; k++ ){

            sum = (int) (sum + Math.pow(Integer.parseInt(str[k]), str.length))   ;

                }


        if(sum==i){
            System.out.println(sum);

        }

        sum =0 ;
        str =null;

    }
/* 
 * To Find The Given Number is Armstrong Or Not.
 */
package Test_2_Feb;

import java.util.Scanner;
public class ArmStrongNo {


    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int count =0,rem,Sum =0,pow;
        System.out.println("\t\tWelcome To the Program To Find Armstrong Number");
        System.out.println("\t\t------- -- --- ------- -- ---- --------- ------");
        System.out.println("Enter The Number ");
        int no = sc.nextInt();
        int temp = no;
        pow = no;
        while(no>0)
        {
            rem = no%10;

            while(pow>0)
            {
                pow = pow/10;
                count++;
                }

            no = no/10;

            if(count!=0)
            {
                Sum = (int) (Sum+Math.pow(rem, count));
            }

        }
        if(temp==Sum)
        {
            System.out.println("\tGiven Number : " +temp + "\n\tSum Of Number : " + Sum + "\n\tSo, The Given Number (" + temp + ") is An armstrong Number");
        }
        else
        {
            System.out.println("\tGiven Number : " +temp + "\n\tSum Of Number : " + Sum + "\n\tSo, The Given Number (" + temp + ") is Not an armstrong Number");

        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM