2017-03-04 320 views
-4

这里是我的程序,它旨在显示输入整数是否是完美数字。需要使用布尔函数并在主函数中调用它。但是,运行试用后,没有输出。任何人都可以帮助这个编程新手...提前感谢任何帮助。在C++中调用布尔函数

#include <iostream> 
using namespace std; 

bool perfect (int num) 
{ 
    int sum = 0, i = 1; 
    while(i < num) { 
     if (num % i == 0) { 
      sum = sum + i; 
      i++; 
     } 
    } 

    if (num == sum) 
     return 1 ; 
    else 
     return 0 ; 
} 

int main() 
{ 
    int num ; 
    cin >> num ; 

    if (perfect (num) == 1) 
     cout << " YES " << endl ; 
    else 
     cout << " NO " << endl ; 
} 
+2

你应该用你的调试器来逐步执行代码,看看它从你的期望有所不同。 – chris

+2

解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

回答

2

让我们来看看你的循环时num == 3i == 2

int i = 1; 
while(i < num) { 
    if (num % i == 0) { 
     sum = sum + i; 
     i++; 
    } 
} 
  1. i < num2 < 3这是真的,那么我们会进入while循环。
  2. num % i == 03 % 2 == 0这是错误的,所以我们不会输入条件。
  3. 我们回到while循环的顶部。
  4. inum没有改变,所以这是一个无限循环。

你可能想是这样的:

bool perfect_number(int x) { 
    int sum_of_divisors = 0; 
    for (int divisor = 1; divisor < x; divisor++) 
    if (x % divisor == 0) 
     sum_of_divisors += divisor; 
    return sum_of_divisors == x; 
} 

,我们可以优化为:

bool perfect_number(int x) { 
    return x == 6 || x == 28 || x == 496 || x == 8128 || x == 33550336; 
} 
+0

谢谢你的帮助!我现在明白问题所在......我从未想过这个问题...... – Paulpaul