Найти идеальный номер из диапазона чисел на основе ввода пользователя - PullRequest
0 голосов
/ 17 мая 2019

Пользователь вводит число, например, 100. Нам нужно найти идеальное число в диапазоне от 1 до пользовательского ввода, равное 100.

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

Например, 6 - идеальное число, потому что 6 - это сумма (1, 2 и 3), которые делят на 6.

#include <iostream>
using namespace std;

int main() {

int input;
int sum=0;

cout << "\t Find perfect Numbers" << endl;
cout << "-------------------------------- \n";
cout << "Enter an upper bound Number: ";
cin >> input;

for (int i=1; i<input; i++)
{
    for(int u=1; u<i; u++)
    {
        if (i%u == 0)
        {
            sum += u;
        }
    }
    if (sum == i)
    {
        cout << sum;
    }
}
return 0;

}

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

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Вам нужно сбросить sum перед вторым for циклом. Если вы этого не сделаете, то sum продолжит увеличиваться во всем диапазоне.

Это означает, например, что перед проверкой регистра i == 6 значение sum будет равно 6 перед входом во второй цикл. После этого вы получите sum == 12 в конце этого теста, и ваш тест не пройдёт.

Так что просто сбросьте sum на 1 в начале (или в конце) вашего первого цикла:

for (int i=1; i<input; i++){

   sum = 1; // <-- Don't forget this line !

   for(int u=2; u < i/u ; u++) // Only going to square root and add u + i/u if i%u == 0
   {
      if (i%u == 0)
      {
         sum += u + i/u; // If i is divisable by u, it is divisable by i/u
      }
   }
   if (sum == i)
   {
      std::cout << sum << std::endl;
   }

}

Как указал Боб__, достаточно перейти к sqrt (i) и добавить одновременно и u, и i / u, что резко сократит время выполнения.

РЕДАКТИРОВАТЬ: сброс на 1 позволяет избежать 1 итерации цикла

0 голосов
/ 17 мая 2019

это даст вам все идеальные числа в пользовательском диапазоне

#include <iostream>

using namespace std;

int main()
{
int input;
int sum=0;

cout << "\t Find perfect Numbers" << endl;
cout << "-------------------------------- \n";
cout << "Enter an upper bound Number: ";
cin >> input;

for (int i=1; i<input; i++)
{
for(int u=1; u<i; u++)
{
    if (i%u == 0)
    {
        sum += u;

    }
}
if (sum == i){
          cout << "\n the perfect number is " <<sum;

        } 
sum = 0;
}
return 0;

}
...