Reputation: 31
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
Reputation: 186718
Perfect numbers (like other perfect things) are very scarce ones
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
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