为什么我的埃拉托色尼筛法 C++ 实现在筛选高于 46349 时不打印任何内容

问题描述 投票:0回答:1

我正在尝试使用 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。

c++ c++20 sieve-of-eratosthenes
1个回答
0
投票

事实证明我只是遇到了整数溢出错误,不得不将变量

j
更改为 long long。

© www.soinside.com 2019 - 2024. All rights reserved.