tl  tr
  Home | Tutorials | Articles | Videos | Products | Tools | Search
Interviews | Open Source | Tag Cloud | Follow Us | Bookmark | Contact   
 Java > Core > Special Numbers > Big Armstrong Number

Big Armstrong Number 

An Armstrong number has sum of its digits raised to the power of number of digits equals the number. i.e. An n-digit number equal to the sum of the nth powers of its digits. The following example deals with very big Armstrong numbers. The 39-digit mammoth number 115132219018763992565095597973971522401 is known to be the biggest Armstrong number.

File Name  :  
com/bethecoder/tutorials/core/special_numbers/BigArmstrongNumber.java 
Author  :  Sudhakar KV
Email  :  [email protected]
   
package com.bethecoder.tutorials.core.special_numbers;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * An Armstrong number has sum of digits raised to the power of number of digits 
 * equals the number
 
 @author Sudhakar KV
 *
 */
public class BigArmstrongNumber {

  /**
   @param args
   */
  public static void main(String[] args) {
    
    /**
     * The largest Armstrong number (in base 10) is the 
     * 39-digit beast: 115132219018763992565095597973971522401
     */
    BigInteger number = new BigInteger("115132219018763992565095597973971522401");
    isArmstrong(number);
  }

  private static int getNumOfDigits(BigInteger number) {
    return String.valueOf(number).length();
  }
  
  private static boolean isArmstrong(BigInteger number) {
    BigInteger orgNumber = new BigInteger(number.toString());
    BigInteger sum = BigInteger.ZERO;
    int digit = 0;
    BigInteger digitPow = BigInteger.ZERO;
    int numOfDigits = getNumOfDigits(number);
    List<Integer> digits = new ArrayList<Integer>();
    List<BigInteger> digitPows = new ArrayList<BigInteger>();
    
    while (number.compareTo(BigInteger.ZERO0) {
      digit = number.mod(new BigInteger("10")).intValue();
      digitPow = new BigInteger(String.valueOf(digit)).pow(numOfDigits);
      sum = sum.add(new BigInteger(String.valueOf(digitPow)));
      number = number.divide(new BigInteger("10"));
      
      digits.add(digit);
      digitPows.add(digitPow);
    }
    
    boolean armstrong = sum.equals(orgNumber);
    System.out.println(orgNumber + " is " 
        (armstrong ? "an armstrong number" "not an armstrong number"
        " " + getSum(digits, digitPows, numOfDigits, sum));
    return armstrong;
  }
  
  private static String getSum(List<Integer> digits, 
      List<BigInteger> digitPows, int numOfDigits, BigInteger sum) {
    
    Collections.reverse(digits);
    Collections.reverse(digitPows);
    StringBuilder sb = new StringBuilder("[ ");
    
    for (int i = ; i < digits.size(); i ++) {
      
      if (i > 0) {
        sb.append(" + ");
      }
      
      sb.append(digits.get(i"^" + numOfDigits);
    }
    
    sb.append(" = ");
    
    for (int i = ; i < digitPows.size(); i ++) {
      
      if (i > 0) {
        sb.append(" + ");
      }
      
      sb.append(digitPows.get(i));
    }

    sb.append(" = ").append(sum).append(" ]");
    return sb.toString();
  }
}
   

It gives the following output,
115132219018763992565095597973971522401 is an armstrong number 
[ 1^39 + 1^39 + 5^39 + 1^39 + 3^39 + 2^39 + 2^39 + 1^39 + 9^39 + 
0^39 + 1^39 + 8^39 + 7^39 + 6^39 + 3^39 + 9^39 + 9^39 + 2^39 + 
5^39 + 6^39 + 5^39 + 0^39 + 9^39 + 5^39 + 5^39 + 9^39 + 7^39 + 
9^39 + 7^39 + 3^39 + 9^39 + 7^39 + 1^39 + 5^39 + 2^39 + 2^39 + 
4^39 + 0^39 + 1^39 = 

1 + 1 + 1818989403545856475830078125 + 1 + 
4052555153018976267 + 549755813888 + 549755813888 + 
1 + 16423203268260658146231467800709255289 + 
0 + 1 + 166153499473114484112975882535043072 + 
909543680129861140820205019889143 + 2227915756473955677973140996096 + 
4052555153018976267 + 16423203268260658146231467800709255289 + 
16423203268260658146231467800709255289 + 549755813888 + 
1818989403545856475830078125 + 2227915756473955677973140996096 + 
1818989403545856475830078125 + 0 + 16423203268260658146231467800709255289 + 
1818989403545856475830078125 + 1818989403545856475830078125 + 
16423203268260658146231467800709255289 + 909543680129861140820205019889143 + 
16423203268260658146231467800709255289 + 909543680129861140820205019889143 + 
4052555153018976267 + 16423203268260658146231467800709255289 + 
909543680129861140820205019889143 + 1 + 1818989403545856475830078125 + 
549755813888 + 549755813888 + 302231454903657293676544 + 0 + 1 

= 115132219018763992565095597973971522401 ]




 
  


  
bl  br