为什么我的程序不打印完美整数? 我是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; } } } #包括 使用名称空间std; bool-IsPerfect(int-n); int main() { 对于(int i=1;i

为什么我的程序不打印完美整数? 我是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; } } } #包括 使用名称空间std; bool-IsPerfect(int-n); int main() { 对于(int i=1;i,c++,math,cout,C++,Math,Cout,在此处输出语句之前,您有一个return语句: return true; cout <<n; 返回true; 试试这个 if(n%x==0){ sum+=x; cout <<n; return true; } if(n%x==0){ 总和+=x; cout问题在这里: if(n%x==0){ sum+=x; return true; cout <<n; } 如果你想捕捉完美数字——等于其除数之和的数字,对吗

在此处输出语句之前,您有一个
return
语句:

return true;
cout <<n;
返回true;
试试这个

if(n%x==0){
    sum+=x;
    cout <<n;
    return true;
}
if(n%x==0){
总和+=x;
cout问题在这里:

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

如果你想捕捉完美数字——等于其除数之和的数字,对吗?——你需要让循环继续进行(和实际上的和,嗯,和)不返回。将print语句和return语句放在循环结束后;然后你应该检查你计算的和是否等于n。

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

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

将cout行从
IsPerfect
中完全删除,并将其放入
main
中:

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

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

我看到3个问题:

  • 您的算法错误。当一个数字第一次被任何因子(包括1)均匀整除时,循环终止。有关算法的解释,请参阅
  • 你有一个未初始化的变量,
    int-sum;
    而且,你只对它进行了写入,而从来没有以有用的方式读取过它

  • 您有无法访问的代码。您的
    无法使程序打印某些内容。此分配来自斯坦福大学的CS016B。由于您使用
    int
    存储(通常为32位),因此只有6个可能的返回值(64位整数的8个可能值)因此,一个更有效的实现是:
    intperfect(intn){static int lookup[]={6,284968128335503368589869056};返回lookup[n];}
    。当然,这可能不是你的教授想要看到的,但是用elaborate的方式计算一些可以存储在一个包含6个条目的查找表中的内容是完全愚蠢的……这不是唯一的问题——如果你将return语句保持在该条件中,它将返回任何数字,因为x以1开头,而n以1开头%1==0,因此在循环的第一次(也是唯一一次)传递中,conditional始终为true。
    if(n%x==0){
        sum+=x;
        cout <<n;
        return true;
    }
    
    for (int x = 1; x < 100; ++x) {
      if (IsPerfect(x)) {
        std::cout << x << '\n';
      }
    }
    
    int sum;
    
    int sum=0;
    
    #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;
    }