尝试使用欧拉定理打印前 5 个完美数
Trying to print first 5 perfect numbers using Euler's theorem
欧拉定理指出,如果方程的右边(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
但我认为这可能会产生某种"无效操作数"错误,因为左侧是double
或float
类型,右侧是int
。为了安全起见,我将它强制转换为int类型:
(int)(pow(2,i) - 1) % j == 0
相关文章:
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 试试完美的正方形,你能给点小费吗
- 如何在c++中打印目录
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 回溯C++不打印函数,因此文件
- 打印最大非完美正方形
- 我的 c++ 程序不打印任何字符,但是如果我将它们更改为 int,代码可以完美运行
- 无法打印在在线编译器中打印完美的心形
- 有人能给我一些关于在C++中使用数组打印出丰富、完美和不足的数字的提示吗
- 尝试使用欧拉定理打印前 5 个完美数