我需要一些帮助修订本。它只有显示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;"

在线“临时= prevtemp + TEMP”也应与该溶液中除去;不再有任何需要对prevtemp变量。

另外,也没有必要另备limitdivisor变量,因为它们总是相同的。只是删除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),并当所述数目是一种精确除数仅增加。

您永远不会指派任何初始化它prevtemp0,所以有什么要补充的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