给定范围内的素数

时间:2013-01-07 15:49:13

标签: c algorithm

我必须找到两个数m和n之间的所有素数。 (1 <= m <= n <= 1000000000且n-m <= 100000)。我正在使用eratosthenes筛,但得到了错误的答案。任何人都可以帮我解决我的代码有什么问题。

#include<stdio.h>
#include<math.h>

int S[100002];
void sieve(long long int m, long long int n)
{
 long long int x=sqrt(n);
long long  int i,j;
long long int a;

 for(i=0;i<=n-m+2;i++)
 S[i]=0;

 if(m%2==0)
     i=m; 

 else {
   i=m+1;

      }

 for (;i<=n;i+=2){
       S[i-m]=1;

            }


 for (i=3;i<=x;i+=2){

     if(i>=m && S[i-m]) continue;

    if(i*i>=m)j=i*i;
     else {
     a = (m-i*i)%(2*i);
      if(a==0)j=m;
       else 
      j=m+ (2*i -a);
    }
     for (;j<=n;j+=2*i){

            S[j-m]=1;
              }
   }

 if (m==1)i=1; else i=0;
 for (;i<=n-m;i++)

     if (!S[i]){


       printf("%lld\n",i+m);
       }


}







  int main(){
  int t;
  long long int m,n;
  scanf("%d\n",&t);
  while(t--){
      scanf("%lld %lld",&m,&n);

      sieve(m,n);
      printf("\n");
         }

    return(0);                         





   }

4 个答案:

答案 0 :(得分:1)

if(m%2==0)
    i=m; 
else {
    i=m+1;
}
for (;i<=n;i+=2){
    S[i-m]=1;
}

现在,m <= 2会发生什么? 2会被视为素数吗?

答案 1 :(得分:0)

你应该在main和call prime函数中使用loop。 为了提高性能,我建议您避免使用sqrt函数,因为它需要大量的CPU时钟。

bool isPrime(int number){

    if(number < 2) return false;
    if(number == 2) return true;
    if(number % 2 == 0) return false;
    for(int i=3; (i*i)<=number; i+=2){
        if(number % i == 0 ) return false;
    }
    return true;

}

***更改数字范围(长,长等)的数据类型。

答案 2 :(得分:0)

这是在一个范围之间查找素数的最有效( Sieve方法)方法。 这里1不作为传统方式考虑作为素数。

#include<stdio.h>
#include<string.h>

#define max 10000000

using namespace std;

int main()
{
    unsigned long long int  i, j, k, m, n;
    unsigned long long int* a = new unsigned long long int[max];

    scanf("%ul %ul",&m,&n);
   for(i = 1;i<=n;i++)
     a[i]=i;
   a[1] = 0;
   for(i=2;(i*i)<=n;i++)
    if(a[i]!=0)
      for(k=2*i;k<=n;k=k+i)
        if(a[k]!=0)
          a[k]=0;

    for(i =m;i<=n;i++)
        if(a[i]!=0) 
          printf("%ul ",a[i]);

    memset(a, 0, sizeof(a));
    return 0;
}

答案 3 :(得分:0)

#include<stdio.h>
#include<stdlib.h>
void prime(int ); 

int main(){
int x,  end;
    printf("Enter end of the range:\n");
    scanf("%d", &end);

    for(x = 2;x <= end;x++){
        prime(x);
    }   
    return 0;
}

void prime(int x){
    int j, count = 1;
    for(j=2;j <= x;j++){
        if(x % j == 0){
            count += 1;
            //printf("count = %d,x = %d", count, x);
        }
    }
    if(count == 2){
        printf("\n%d\n", x);
    }
}