尝试使用欧拉定理打印前5个完美数字

时间:2015-10-15 05:01:49

标签: c++

欧拉定理指出,如果右边(2 ^ n -1)是素数,则该等式导致完美数。

2 ^(n-1)*(2 ^ n -1)

我的代码试图生成前5个完美数字:6,28,496.8128等...但是在执行时它只是打印出具有不同n值的欧拉方程的数字(1,2,3,4)等等..)。我的Prime条件似乎有误。有人可以帮忙吗?

所以我得到6,28,120,496,2016等...作为我的结果

#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;
int main(void) {
    for (int i = 2; i<100; i++)
    {
    bool prime = true;
    for (int j = 2; j*j <= i; j++)
    {
        if (pow(2,i) - 1 % j == 0)
        {
            prime = false;
            }
    }
    if (prime = true)
    {
        cout << pow(2, i - 1)*(pow(2, i) - 1) << " ";
    }
}
return 0;
}

1 个答案:

答案 0 :(得分:1)

在你的if条件下

if (prime = true)

=运算符是赋值运算符。在您的案例中,每次迭代时评估为true。您应该使用==运算符。相反,你应该

if (prime == true)

此外,您的内部for循环应该一直运行到sqrt (pow(2, i) - 1)。现在,您只测试最多i的数字是否为素数。取而代之的是

for (int j = 2; j*j <= pow(2,1)-1; j++)

现在,你迭代所有数字,直到所需数值的平方根(&#34;右边&#34;欧拉定理)。

很抱歉所有的编辑和添加,但是:在你的第一个if声明中,我认为你的表达式不会产生预期的结果,主要是因为操作的顺序。在C ++中,%操作数的优先级高于+/-,因此在表达式

pow(2,i) - 1 % j == 0
首先评估

1 % j,然后进行减法。同样,这不会产生您想要的结果。自然的解决方案是简单地在表达式周围放置括号,如下所示:

(pow(2,i) - 1) % j == 0

但我认为这可能会产生某种无效的操作数&#34;错误,因为左侧是doublefloat类型,右侧是int。所以为了安全起见,我会把它作为一个int:

(int)(pow(2,i) - 1) % j == 0