C ++完美数字。需要一些帮助修改

时间:2010-03-15 20:15:42

标签: c++ numbers perfect-numbers

我需要一些帮助来修改这个。它只保持显示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 个答案:

答案 0 :(得分:5)

您永远不会将prevtemp设置为0以外的任何内容,因此将其添加到temp不会做任何事情。

我相信你的意思是

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

此解决方案也应删除“temp = prevtemp + temp”行;不再需要prevtemp变量。

此外,无需保留单独的limitdivisor变量,因为它们始终相同。只需删除limit并更改循环条件即可使用divisor

另外,正如Mark Byers指出的那样,如果你将它重构为for循环而不是while,那么循环就会更容易理解。

答案 1 :(得分:2)

好像你让它变得太复杂了。这是你如何做到的:

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),并且只有在数字是精确除数时才会增加。

答案 2 :(得分:1)

我不确定,但我在代码中猜到了:

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

答案 3 :(得分:0)

在将prevtemp初始化为0后,您永远不会向temp分配任何内容,因此在temp = prevtemp + temp的行上没有任何内容可添加到{{1}}。

答案 4 :(得分:0)

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