我正在尝试使用 C++ 制作埃拉托色尼筛,但是,我的程序每当输入 46350 或更高的数字作为筛范围的顶端时,它就不会输出任何内容。看起来,对于任何较低的数字,工作都完全按照预期进行。
我的代码:
#include <stdio.h>
#include <array>
#include <iostream>
#define squarert 46350 // I found that it doesn't give correct answers if the "squareroot" number is actually the square root of the second number.
#define num squarert
#define size 10001
std::array < long long, size > eSieve ()
{
std::array < long long, size > primes; //array declared
std::array < bool, num > numbers;
for(int i = 2; i < squarert; i++) {
numbers[i] = true;
}
for(int i = 2; i <= squarert; i++) {
if (numbers[i]) {
for(int j = i * i; j < num; j += i) {
numbers[j] = false;
}
}
}
int count = 1;
for(int i = 2; i < num; i++) {
if(numbers[i]) {
primes[count] = i;
count++;
}
}
return primes; //array returned
}
int
main ()
{
std::array<long long,size> arr;
arr=eSieve(); //function call
for(int i = 1; i < 10000; i++) {
std::cout<<arr[i]<<" ";
}
return 0;
}
我意识到这非常糟糕,我只是想得到一个可用的筛子,然后提高可读性。
我尝试了反复试验来找到程序崩溃的确切数字,即 46350。在该数字或更高的数字下,它只是以退出代码 0 完成,并且在控制台中没有输出。我在网上找不到任何与这个数字相关的东西,而且它的二进制似乎没有什么特别的。我在 onlinegdb 上使用 C++ 20。
事实证明我只是遇到了整数溢出错误,不得不将变量
j
更改为 long long。