我正在尝试生成素数而且我几乎让它工作但是由于某种原因它表明当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;
}
答案 0 :(得分:6)
您的代码使用未初始化的变量:
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
。