C++ c++;atkin实现的筛子中5的倍数
我正在euler项目中解决一个问题,它要求我找到所有素数的总和,小于200万。我试图实现atkin的筛子,奇怪的是,它将65,85这样的数字设置为素数。我看了一天多的代码和算法,但没有发现任何错误。我肯定这一定是件傻事,但我找不到。提前谢谢 我正在使用visual studio express 2012 代码如下:C++ c++;atkin实现的筛子中5的倍数,c++,sieve-of-atkin,C++,Sieve Of Atkin,我正在euler项目中解决一个问题,它要求我找到所有素数的总和,小于200万。我试图实现atkin的筛子,奇怪的是,它将65,85这样的数字设置为素数。我看了一天多的代码和算法,但没有发现任何错误。我肯定这一定是件傻事,但我找不到。提前谢谢 我正在使用visual studio express 2012 代码如下: #include "stdafx.h" #include <iostream> #include <math.h> #include <vector&g
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <vector>
#include <fstream>
#include <conio.h>
int main(){
long long int limit,n;
std::cout<<"Enter a number...."<<std::endl;
std::cin>>limit;
std::vector<bool> prime;
for(long long int k=0;k<limit;k++){ //sets all entries in the vector 'prime' to false
prime.push_back(false);
}
long long int root_limit= ceil(sqrt(limit));
//sive of atkin implementation
for(long long int x=1;x<=root_limit;x++){
for(long long int y=1;y<=root_limit;y++){
n=(4*x*x)+(y*y);
if(n<=limit && (n%12==1 || n%12==5)){
prime[n]=true;
}
n=(3*x*x)+(y*y);
if(n<=limit && n%12==7){
prime[n]=true;
}
n=(3*x*x)-(y*y);
if(x>y && n<=limit && n%12==11){
prime[n]=true;
}
}
}
//loop to eliminate squares of the primes(making them square free)
for(long long int i=5;i<=root_limit;i++){
if(prime[i]==true){
for(long long int j=i*i;j<limit;j+=(i*i)){
prime[j]=false;
}
}
}
unsigned long long int sum=0;
//print values to a seperate text file
std::ofstream outputfile("data.txt");
outputfile<<"2"<<std::endl;
outputfile<<"3"<<std::endl;
for(long long int l=5;l<limit;l++){
if(prime[l]==true){
sum+=l;
outputfile<<l<<std::endl;;
}
}
outputfile.close();
std::cout<<"The sum is...."<<sum+5<<std::endl;
prime.clear();
return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
int main(){
长整数极限,n;
std::cout您应该将条目翻转到筛选列表。在第一个嵌套的for循环中,而不是prime[n]=true;
您应该有prime[n]=!prime[n];
但我不明白这与将value设置为true有什么不同……您能解释一下吗?谢谢:)有些值(如1985)是“已访问”的(即其中一个ifs成功)不止一次。第一轮p[n]设置为真时,第二轮p[n]设置为假。