1

我需要一些帮助来修改这个。它只显示0s作为温度。谢谢你。

// 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;
4

5 回答 5

5

您永远不会设置prevtemp为 0 以外的任何值,因此将其添加到temp什么都不做。

我相信你是想说

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

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

此外,没有必要保持单独的limitdivisor变量,因为它们总是相同的。只需删除limit并更改循环条件以使用divisor.

此外,正如 Mark Byers 指出的那样,如果将循环重构为for循环而不是while.

于 2010-03-15T20:18:41.247 回答
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)的变量中,并且仅当数字是精确除数时才会增加。

于 2010-03-15T20:26:11.200 回答
1

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

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

你打算这样做prevtemp=divisor。这解决了一个明显的问题,但仍然留下了很多看起来不像你可能想要的那样做的事情。例如,我不太清楚limit要完成什么——你初始化它并增加它,但据我所知,你从不使用它的值(好吧,我猜你使用它,但它的值是总是与 's 相同,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;
}
于 2010-03-15T20:23:12.117 回答
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; 
}
于 2014-03-05T09:08:02.610 回答
0

prevtemp在将其初始化为 之后,您永远不会分配任何内容,因此在读取的行上0没有任何内容可添加。temptemp = prevtemp + temp

于 2010-03-15T20:20:59.267 回答