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;
}
答案 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;错误,因为左侧是double
或float
类型,右侧是int
。所以为了安全起见,我会把它作为一个int:
(int)(pow(2,i) - 1) % j == 0