Идеальное число - это число, равное сумме всех его положительных делителей, исключая себя.
Для моей домашней работы я пытаюсь написать программу, чтобы найти все четыре совершенных числа под 10000, но мой код не работает, когда я запускаю его, и я не уверен, почему (он просто работает на секунду или два, и затем говорит, что "построить успешный" после того, как ничего не печатал). Я включил его ниже, а также некоторые комментарии, которые объясняют мой мыслительный процесс. Может кто-нибудь помочь мне и рассказать мне, что с ним не так?
public class HomeworkTwo {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
//Variable declaration
int n;
int possibleFactor;
int factorSum=0;
/**For each n, the program looks through all positive integers less than n
and tries to find factors of n. Once found, it adds them
together and checks if the sum equals n. Then it repeats till n=9999. **/
for (n=2; n<10000; n++) {
for (possibleFactor = 1; possibleFactor < n; possibleFactor++) {
if (n % possibleFactor == 0) {
factorSum = possibleFactor + factorSum;
}
//Is the number perfect? Printing
if (factorSum == n) {
System.out.println(""+ n +" is a perfect number.");
}
}
}
}
}
Вы инициализируете factorSum
до 0
перед первым циклом for
, но вы не сбрасываете его на 0
при попытке каждого нового n
. Факторы продолжают складываться и никогда не сравниваются с числом, которое он должен проверить. Сброс его в 0
в начале n
for
цикла.
Кроме того, вы можете переместить тест и печать числа будучи совершенное число после внутренней for
цикла, но до конца внешнего for
контура, или же он может напечатать больше, чем необходимо.
Я полагаю, вы уже это сделали, но в любом случае основной проблемой в вашем коде является переменная factorSum. После проверки каждого номера вы должны снова установить его на 0. Кроме того, я использовал printf вместо println, но это то же самое:
public static void main(String[] args) {
int number = 0;
int factor = 0;
int factorSum = 0;
for(number = 2; number < 10000; number++) { //for each number we will check the possible factors.
factorSum = 0;
for(factor = 1; factor < number; factor++)
if((number % factor) == 0) { //if it is a factor, we add his value to factorSum.
factorSum = factorSum + factor;
}
if(factorSum == number) {
System.out.printf("The number: %d is a perfect number.\n", number);
}
}
}
У вас есть несколько проблем с вашей программой:
factorSum
на 0
после прохождения через факторыfactorSum == n
ПОСЛЕ добавления всех факторов, а не внутри цикла.n/2
; например, 10 никогда не будут делимы на 7.Здесь полученная программа (с немного лучшим форматированием):
public class HomeworkTwo {
/**
* @param args
* the command line arguments
*/
public static void main(String[] args) {
// Variable declaration
int n;
int possibleFactor;
int factorSum = 0;
/**
* For each n, the program looks through all positive integers less than n
* and tries to find factors of n. Once found, it adds them together and
* checks if the sum equals n. Then it repeats till n=9999.
**/
for (n = 2; n < 10000; n++) {
factorSum = 0;
for (possibleFactor = 1; possibleFactor <= n / 2; possibleFactor++) {
if (n % possibleFactor == 0) {
factorSum = possibleFactor + factorSum;
}
}
// Is the number perfect? Printing
if (factorSum == n) {
System.out.println("" + n + " is a perfect number.");
}
}
}
}
Вы должны так держать
for (n=2; n<10000; n++) {
for (possibleFactor = 1; possibleFactor < n; possibleFactor++) {
if (n % possibleFactor == 0) {
factorSum = possibleFactor + factorSum;
}
}
//Is the number perfect? Printing
if (factorSum == n) {
System.out.println(""+ n +" is a perfect number.");
}
factorSum = 0;
}
factorSum =0
после того, как внешний циклfactorSum =0
каждую итерацию.