为什么我的程序不能打印出完美的整数?

时间:2013-06-10 17:07:44

标签: c++ math cout

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

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

7 个答案:

答案 0 :(得分:4)

我看到3个问题:

  1. 你的算法错了。你的循环在第一次数字可以被任何因子(包括1)整除时终止。有关算法的说明,请参阅Wikipedia
  2. 你有一个未初始化的变量int sum;此外,你只是写信给它,你从来没有以有用的方式阅读它。
  3. 您的代码无法访问。循环中的cout << n;永远不会被击中。
  4. 请尝试以下更正的代码:

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

答案 1 :(得分:3)

在输出语句之前,您有return语句:

return true;
cout <<n;

你需要交换这些语句的顺序,你也可能想要添加一个逗号或其他一些分隔符:

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

我不确定您要返回的位置,因为您将在第一次输入if语句时退出,这将在x1时发生。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

完全从IsPerfect删除cout行,然后将其放入main

for (int x = 1; x < 100; ++x) {
  if (IsPerfect(x)) {
    std::cout << x << '\n';
  }
}

答案 4 :(得分:0)

试试这个

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

答案 5 :(得分:0)

问题出在这里:

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

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

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

答案 6 :(得分:0)

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

int sum;

int sum=0;