Поиск и печать идеальных чисел до 10000 (Лян, Введение в Java, упражнение 5.33)

1

Идеальное число - это число, равное сумме всех его положительных делителей, исключая себя.

Для моей домашней работы я пытаюсь написать программу, чтобы найти все четыре совершенных числа под 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.");
                }
            }
        }
    }
}
  • 2
    я думаю, вам нужно сделать factorSum =0 после того, как внешний цикл factorSum =0 каждую итерацию.
Теги:
netbeans
perfect-numbers

4 ответа

3
Лучший ответ

Вы инициализируете factorSum до 0 перед первым циклом for, но вы не сбрасываете его на 0 при попытке каждого нового n. Факторы продолжают складываться и никогда не сравниваются с числом, которое он должен проверить. Сброс его в 0 в начале n for цикла.

Кроме того, вы можете переместить тест и печать числа будучи совершенное число после внутренней for цикла, но до конца внешнего for контура, или же он может напечатать больше, чем необходимо.

1

Я полагаю, вы уже это сделали, но в любом случае основной проблемой в вашем коде является переменная 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);
        }
    }
}
1

У вас есть несколько проблем с вашей программой:

  1. Вам необходимо сбросить factorSum на 0 после прохождения через факторы
  2. Вы должны проверить свой factorSum == n ПОСЛЕ добавления всех факторов, а не внутри цикла.
  3. Вам нужно только проверить до 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.");
      }
    }
  }
}
  • 0
    Спасибо, это был хороший ответ. Было бы неплохо, но пока не хватает представителя, так что этот комментарий будет временной заменой
  • 0
    @Asker Вы все еще можете поставить галочку :)
0

Вы должны так держать

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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню