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

Trying to print first 5 perfect numbers using Euler's theorem

本文关键字:完美 打印 定理      更新时间:2023-10-16

欧拉定理指出,如果方程的右边(2^n -1)是素数,则得到一个完全数。

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

我的代码正试图生成前5个完全数:6,28,496.8128等…然而,在执行时,它只是以不同的n值(1、2、3、4等)打印欧拉方程的数字。看来我的最佳状态出了问题。有人能帮忙吗?

所以我得到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;
}

在if条件中有

if (prime = true)

=运算符是赋值运算符。在您的情况下,每次迭代都会计算为true。您应该使用==操作符。而应该是

if (prime == true)

同样,您的内部for循环应该运行到(pow(2, i) - 1)sqrt。现在你只测试i以内的数是否为素数。改为

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

现在,遍历所有数字,直到所需值的平方根(欧拉定理的"右侧")。

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

pow(2,i) - 1 % j == 0
首先计算

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

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

但我认为这可能会产生某种"无效操作数"错误,因为左侧是doublefloat类型,右侧是int。为了安全起见,我将它强制转换为int类型:

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