C ++ Perfect Number. Нужна помощь в пересмотре - PullRequest
1 голос
/ 15 марта 2010

Мне нужна помощь в пересмотре этого. Он отображает только 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;

Ответы [ 5 ]

5 голосов
/ 15 марта 2010

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

Я полагаю, вы хотели сказать

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

Строка "temp = prevtemp + temp" также должна быть удалена с этим решением; Переменная prevtemp больше не нужна.

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

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

2 голосов
/ 15 марта 2010

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

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) и увеличивается только тогда, когда число является точным делителем.

1 голос
/ 15 марта 2010

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

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;
}
0 голосов
/ 05 марта 2014
#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; 
}
0 голосов
/ 15 марта 2010

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

...