inzikind
inzikind

Reputation: 31

Perfect Numbers Display Java

I have the following question for Homework

If a number is equal to the sum of all of its factors except itself, it is a perfect number. For example, 6 is a perfect number since 6 = 1 + 2 + 3.

Write a program that takes an input number and displays all perfect numbers up to and including that number.

and this is what I have so far

import java.util.*;
public class perfectnumbers
 {
public static void main(String[] args){
   Scanner console = new Scanner(System.in);
   
   int externalNumber;
 
   int internalNumber;
   int internalTotal = 0;
   
   System.out.println("Input Number");
   externalNumber = console.nextInt();
   
   while (externalNumber > 0) {
       internalNumber = externalNumber;
       while (internalNumber > 0) {
           internalNumber = internalNumber - 1;
           internalTotal = internalNumber + internalTotal;
        }
        if (internalTotal == externalNumber) {
            System.out.println(internalTotal);
        }
        externalNumber = externalNumber - 1;
        internalTotal = 0;
    }
}
}

But for some Reason when ever I enter a number only 3 gets outputted... Can anyone help?

Upvotes: 1

Views: 150

Answers (2)

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186718

Perfect numbers (like other perfect things) are very scarce ones

https://oeis.org/A000396

they are (within the int range):

6, 28, 496, 8128, 33550336

(only three more 8589869056, 137438691328, 2305843008139952128 when working with long).

So you can implement it like that:

  private static int[] perfectNumbers = new int[] {
    6, 28, 496, 8128, 33550336
  };

  private static void displayPerfects(int upTo) {
    for (int item : perfectNumbers) 
      if (item > upTo)
        break;
      else {
        System.out.print(item); 
        System.out.println();
      }
  }

  ...

  public static void main(String[] args) {  
    ...
    System.out.println("Input Number");
    ...
    externalNumber = console.nextInt();
    ...
    displayPerfects(externalNumber);
  }

Please note, that efficiency really matters in your case, e.g. how much time does it take if your're given, say, 2000000000? All you have to do is to test at most five values.

Upvotes: 2

gonzo
gonzo

Reputation: 2121

You never check for a factor. Do something like this:

while (externalNumber > 0) {
    internalNumber = externalNumber-1;  //Make sure to subtract one here
    while (internalNumber > 1) { //Change this to 1 so you don't divide by 0
        internalNumber = internalNumber - 1;
        if (externalNumber%internalNumber==0){ //Check for factor
            internalTotal = internalNumber + internalTotal;
        }
    }
    if (internalTotal == externalNumber) {
        System.out.println(internalTotal);
    }
    externalNumber = externalNumber - 1;
    internalTotal = 0;
}

Upvotes: 1

Related Questions