C++ c++;atkin实现的筛子中5的倍数

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

我正在euler项目中解决一个问题,它要求我找到所有素数的总和,小于200万。我试图实现atkin的筛子,奇怪的是,它将65,85这样的数字设置为素数。我看了一天多的代码和算法,但没有发现任何错误。我肯定这一定是件傻事,但我找不到。提前谢谢 我正在使用visual studio express 2012

代码如下:

#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]设置为假。