2

我是 C++ 编程新手,我的一个程序有问题

#include <iostream>
using namespace std;
bool IsPerfect(int n);

int main ()
{
  for(int i=1; i<100; i++){
    IsPerfect(i);
  }

  return 0;
}

bool IsPerfect(int n){
  int sum;
  for(int x=1; x<n; x++){
    if(n%x==0){
      sum+=x;
      return true;
      cout <<n;
    }
    else{
      return false;
    }
  }
}

我正在尝试创建一个列出完美数字的程序,但我找不到关于它为什么不打印的错误。

4

7 回答 7

4

我看到3个问题:

  1. 你的算法是错误的。您的循环在一个数字第一次被任何因子(包括 1)整除时终止。有关该算法的说明,请参见Wikipedia 。
  2. 你还有一个未初始化的变量int sum;,你只写过它,你不会以有用的方式读取它。
  3. 您有无法访问的代码。你cout << n;的循环永远不会被击中。

尝试以下更正的代码:

#include <iostream>
#include <cassert>
using namespace std;

bool IsPerfect(int n)
{
        int sum = 1;
        for(int x = 2; x < n; ++x)
        {
                if(n % x == 0)
                        sum += x;
        }
        return sum == n;
}

int main ()
{
        for(int i=1; i<100; i++){
                if (IsPerfect(i))
                        cout << i << endl;
        }

        assert(IsPerfect(6));
        assert(IsPerfect(28));
        assert(IsPerfect(496));

        return 0;
}
于 2013-06-10T17:53:13.597 回答
3

You have a return statement before you output statement here:

return true;
cout <<n;

you need to swap the order of these statements, you also probably want to add a comma or some other separator:

std::cout << n << ", " ;
return true;

I am not sure that is where you want to return from since you will exit the first time you enter that if statement, which will happen when x is 1.

于 2013-06-10T17:08:56.003 回答
2

如果你想捕捉完美的数字 - 等于它们的除数之和的数字,对吗?- 您需要允许循环继续进行(并且总和实际上是总和)而不返回。把你的 print 语句和你的 return 语句放在循环结束之后;您应该检查您计算的总和是否等于 n。

于 2013-06-10T17:13:06.043 回答
1

所有这些答案都在告诉您在返回之前写下数字。但这忽略了这里糟糕的设计:你有一个函数可以决定一个数字是否完美;它不应该是那个函数也决定如何处理这些信息(打印它、存储它、通过网络发送它,......)。

这也将使您的代码更具可读性,因为名称IsPerfect具有误导性 - 它告诉读者此函数仅返回数字是否完美。因此,主函数中的循环读作“对于整数 1 到 100,询问它是否完美并忽略答案”。这不是一个有用的程序。

完全删除 cout 线IsPerfect并将其放入main

for (int x = 1; x < 100; ++x) {
  if (IsPerfect(x)) {
    std::cout << x << '\n';
  }
}
于 2013-06-10T17:22:55.863 回答
0

问题在这里:

if(n%x==0){
    sum+=x;
    return true;
    cout <<n;
}

关键字return立即结束函数并返回适当的值 ( true)。这意味着它后面的所有语句都不会被执行。尝试以下操作:

if(n%x==0){
    sum+=x;
    cout <<n;
    return true;
}
于 2013-06-10T17:11:27.437 回答
0

除了其他人指出的问题之外,您永远不会计算出正确的答案,因为您没有初始化sum变量。改变

int sum;

int sum=0;
于 2013-06-10T17:38:12.963 回答
0

尝试这个

if(n%x==0){
    sum+=x;
    cout <<n;
    return true;
}
于 2013-06-10T17:10:15.360 回答