Совершенное число С++.Нужна помощь в пересмотре

StackOverflow https://stackoverflow.com/questions/2450155

  •  20-09-2019
  •  | 
  •  

Вопрос

Мне нужна помощь в пересмотре этого.Он продолжает отображать только 0 в качестве температуры.Спасибо.

// A program to determine whether the input number is a perfect number
// A perfect number is defined by the sum of all its positive divisors excluding itself
// 28: 1+2+3+7+14 = 28. 

int perfect, limit, divisor;

cout << "Please enter a positive integer in order to define whether it is a perfect integer or not: " ;
 cin >> perfect;
 cout << endl;

 int temp = 0;
 int prevtemp = 0;
  limit = 1;
  divisor = 1;
 while (limit < perfect)
 {

  if ((perfect % divisor) == 0)
   {
   divisor = prevtemp;
   temp = prevtemp + temp;
   }

  limit++;
  divisor++;
 }

 if (perfect == temp)
  cout << "Your number is a perfect number!" << endl;
 else
  cout << "Your number is not a perfect number" << endl;

 return 0;
Это было полезно?

Решение

Я не уверен, но предполагаю, что в коде:

if ((perfect % divisor) == 0)
    divisor = prevtemp;

ты хотел, чтобы это было prevtemp=divisor вместо.Это устраняет очевидную проблему, но все равно оставляет кое-что не похожее на то, что вы, вероятно, предполагали.Я, например, не могу понять, что limit предназначено для выполнения - вы его инициализируете и увеличиваете, но, насколько я вижу, вы никогда использовать его значение (ну, я думаю, вы его используете, но его значение всегда такое же, как и divisorпоэтому я не понимаю, почему вы думаете, что вам нужно и то, и другое, и как limit имеет какой-то смысл в названии).

Редактировать:Было бы разумно иметь limit.В частности, факторы всегда идут парами:тот, который меньше или равен квадратному корню из числа, и тот, который соответствует первому, который всегда больше или равен квадратному корню из числа.Таким образом, вам не нужно сканировать все до самого числа в поисках коэффициентов — вы можете установить квадратный корень числа в качестве предела и сканировать только до этой точки.Для каждого фактора, который вы найдете до этого момента, коэффициент соответствия будет равен perfect/divisor.Поскольку у вас уже есть один рабочий пример, я думаю, мне стоит просто надеяться, что это не домашнее задание, и также опубликовать пример:

bool is_perfect(int number) { 
    int limit = sqrt((double)number);
    int sum = 1;

    for (int i=2; i<=limit; i++)
        if (number % i == 0) 
            sum += i + number/i;
    return sum == number;
}

Другие советы

Вы никогда не устанавливаете prevtemp ко всему, кроме 0, поэтому добавление его к temp ничего не делает.

Я думаю, ты хотел сказать

if ((perfect % divisor) == 0) 
    temp += divisor; // not "divisor = prevtemp;"

В этом решении также следует удалить строку «temp = prevtemp + temp»;больше нет необходимости в prevtemp переменная.

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

Кроме того, как отметил Марк Байерс, цикл было бы проще понять, если бы вы реорганизовали его в for цикл, а не while.

Кажется, вы все слишком усложняете.Вот как это можно сделать:

int total = 0;
for (int i = 1; i < perfect; ++i)
{
    if (perfect % i == 0)
        total += i;
}

if (perfect == total)
    cout << "Your number is a perfect number!" << endl;
else
    cout << "Your number is not a perfect number" << endl;

Обратите внимание, что промежуточная сумма хранится в переменной с именем total (вы назвали эту переменную temp), и она увеличивается только тогда, когда число является точным делителем.

Вы никогда ничего не назначаете prevtemp после его инициализации 0, так что добавить нечего temp в строке, которая читает temp = prevtemp + temp.

#include<iostream>
#include<iomanip>
using namespace std;

int main(){
    int n,i=1,sum=0;
    cout<<"Enter a number: ";
    cin >> n;
    while(i<n){
        if(n%i==0)
            sum=sum+i;
        i++;
    }
    if(sum==n)
         cout << i  <<  " is a perfect number";
    else
         cout << i << " is not a perfect number";
    system("pause");
    return 0; 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top