Совершенное число С++.Нужна помощь в пересмотре
-
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;
}