所以这是我的问题。是什么导致了代码中看似无关的变化的段错误?
#include <iostream>
#include <stdio.h>
#include <set>
#include <vector>
#include <math.h>
std::set<int> atkin(int m){
int r=0; bool s[m+2]; std::set<int> set;
for(int i=0;i<m+2;++i)
s[i]=false;
s[2]=s[3]=true;
int xr=pow((m-1)/4,.5);
for(int x=1;x<=xr;++x){
int yr=pow(m-4*x*x,.5);
for(int y=1;y<=yr;++y) {
int n=4*x*x+y*y;
int nm=n%12;
if(nm==1||nm==5)s[n]=!s[n];
}
}
xr=pow((m-1)/3,.5);
for(int x=1;x<=xr;++x){
int yr=pow(m-3*x*x,.5);
for(int y=1;y<=yr;++y) {
int n=3*x*x+y*y;
int nm=n%12;
if(nm==7)s[n]=!s[n];
}
}
xr=pow(2*m/3,.5); //was xr=pow(m+1)/3,.5); <- this worked fine.
for(int x=1;x<=xr;++x){
int yr=pow(3*x*x-m-1,.5);
for(int y=1;y<=yr;++y) {
int n=3*x*x-y*y;
int nm=n%12;
if(x>y && nm==11)s[n]=!s[n];
}
}
for(int i=5;i<=pow(m,.5);++i){
if(s[i]){
int k=i*i;
while(k<=m) {
s[k]=false;
k+=i*i;
}
}
}
for(int i=2;i<=m;++i){
if(s[i]) {set.insert(i); printf("%03d ", i); if(++r%20==0) printf("\n");} //segfault directs here on gdb and valgrind
}
return set;
}
发生了什么事?我认为这是因为xr
的值较大,但我看不出它是如何连接到set.insert(i);
的,这个文件也被包含在第二个调用atkin()
的文件中在Windows 8和arch linux上都有这个问题。感谢您的帮助,如果我的代码以任何方式激怒您,我很抱歉。