为什么我的代码说109不是素数

Why does my code say 109 is not a prime?

本文关键字:我的 代码 为什么      更新时间:2023-10-16

我正在尝试生成素数,我几乎让它工作了,但由于某种原因,它表明当109是素数时,109不是素数。

所以当我输出factorCount时,它显示"113::29",当113是第30个素数时,它是107而不是109。

#include <iostream>
using namespace std;
void mark(bool arr[], int a, int n){
    int i = 2;
    int num = 0;
    while((num = i*a) <= n){
        arr[num-1] = 1;
        i++;
    }
}
void sieve(int n){
    int primeCount = 0;
    if(n >= 2){
        bool arr[n];
        for(int i=1; i<n; i++){
            if(arr[i] == 0){
                primeCount++;
                cout << i+1 << " :: " << primeCount << endl;
                mark(arr, i+1, n);
            }
        }
    }
}
int main(){
    int n = 120;
    sieve(n);
    return 0;
}

您的代码使用未初始化的变量:

bool arr[n];
for(int i=1; i<n; i++){
    if(arr[i] == 0){      // <--- here

如果未将arr[i]的值设置为任何值,则检查该值。

此外,bool arr[n];在C++中是非法的,尽管有些编译器将其作为扩展添加。在标准C++中,数组边界必须在编译时已知。要修复它,请将bool arr[n];更改为:

std::vector<unsigned char> arr(n);  // note: parentheses, not square brackets

此版本将对成员进行零初始化。不幸的是,vector<bool>不能在这里工作,因为它有一个奇怪的专业化。您需要将&arr[0]传递给mark,而不仅仅是arr

相关文章: