为什么我的埃拉托色尼代码筛子无限循环.我已经用几个数字进行了测试
Why is my sieve of Eratosthenes code looping infinitely. I have tested with a few numbers
我正在尝试从下面的伪代码中实现C++的埃拉托色尼算法的筛子:
输入:整数 n> 1。
设 A 是一个布尔值数组,由整数 2 到 n 索引, 最初全部设置为 True。
对于 i = 2, 3, 4, ...,不超过 √n: 如果 A[i] 为真: 对于 j = i2, i2+i, i2+2i, i2+3i, ..., 不超过 n: A[j] := 假。
输出:所有 i 使得 A[i] 为真。
但是,我的代码在最后一个 for 循环中无限循环,我不知道为什么。
void primes(int n)
{
bool numArr[n];
for (int a=2;a<n;a++)
{
numArr[a]=true;
}
int k,j, m = int(sqrt(n));
for(int i=2;i<m;i++)
{
k=0;
if(numArr[i]==true)
{
for(j=i^2;j<n;j+(k*i))
{
numArr[j]=false;
k++;
}
}
}
for(int j=1;j<n;j++)
{
if(numArr[j]==true)
{
cout<<numArr[j]<<endl;
}
}
}
首先,C++中没有VLA。然而,一些编译器会容忍它们,而另一些则不会。对于便携式解决方案,std::vector
效果很好。将您的 VLA 替换为以下内容:
std::vector<bool> numArr(n);
您甚至可以将初始化放入其中。不需要将所有内容设置为true
的循环,只需将numArr(n)
更改为numArr(n, true)
,一切都为您完成。
但是,您的主要问题就在这里:
for(j=i^2;j<n;j+(k*i))
j=i^2
不会做你认为它做的事情,你的j+(k*i)
增量不会增加任何东西。实际上,k
部分毫无意义。请改为执行以下操作:
for (j = i*i; j < n; j += i)
你的cout<<numArr[j]<<endl;
印刷品也是错误的。 numArr[j]
是bool
,所以每次都会打印1
。当然,您想打印j
而不是numArr[j]
.
虽然这不是问题,但您不必写if (numArr[i] == true)
.只是做if (numArr[i])
。 numArr[i]
已经是bool
了.
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- C++通过数字比较两个数字
- 如何返回或护理项目清单基于几个类别
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 如果我不知道每个列表中有多少个数字,我如何将给定数量的数字列表作为输入?
- 获取 2 个数字之间的差异百分比
- 我们如何在文本文件中找到C++中的几个单词?
- 在 txt 文件中显示前两个数字的程序
- 关于 std::bitset 构造函数的几个问题?
- 在循环中使用字符串流从几个字符串中提取数字
- 为什么我的埃拉托色尼代码筛子无限循环.我已经用几个数字进行了测试
- 使用C - CIN获取几个整数数字,然后将它们放入数组中
- 将几个数字分配给Boost Vector
- 创建几个相互不兼容的数字类型
- 将几个数字作为一个数组参数传递给函数
- 在matplotlib中显示几个数字而不停止计算