找到两个非常大的范围之间的素数

时间:2015-01-17 18:24:15

标签: java algorithm

我想找到两个数字之间的素数,然后说A和B 2<A B<10^8 这是我的方法

public static boolean isprime(int a){

    for(int i=2;i<=Math.sqrt(a);i++)
        if(a%i==0) return false;

    return true;
}

for(int i=A;i<=B;i++) if(isprime(i)) ans++;

如果A = 2且B = 10 ^ 8,则需要花费大量时间如何改进算法。
谢谢

2 个答案:

答案 0 :(得分:1)

素数是一个正自然数,只有两个正自然数除数 - 一个和它自己。素数的反面是复合数。复合数是一个正自然数,至少有一个正除数而不是一个或它本身。

public class Question3 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub


                PrimeCount(10,30);;
    }

    public static int PrimeCount( int start,int end)
    {
          int count=0;
        if(start<0)
        {
            if(end > 2)
            {
                count ++;
            }
            start=0;
        }
        if(end < 0)
        {
            end=0;
        }

      for(int i=start;i<=end;i++)
      {

         for(int j=2;j<i;j++)
         {

             if(i%j==0)
             { 
                 //count ++;
                 break;// innerloop;
             }
             else
             {
                 if(j+1==i)
                 {
                    // count ++;
                     System.out.println(i); //display the prime number
                 }
                 else
                 {
                     continue;

                 }
             }
         }
      }
    return count;//returns the count of prime numbers in the given range
    }

}

答案 1 :(得分:0)

在A + B的主循环中,你只能探测数字“6a + -1”, 因为:

6a   - is not prime, divisible by 6
6a+1 - can be prime
6a+2 - is not prime, even
6a+3 - is not prime, divisible by 3
6a+4 - is not prime, even
6a+5 - 6(a+1)-1.

因此,您可以将性能提高3倍。

此外,函数IsPrime()可以尝试除以2,然后仅迭代奇数分频器,其中i + = 2。这也是两次提高性能。

因此,在不严重改变算法的情况下,可以轻松获得6倍的性能提升。

更有效的方法 - 通过小费马定理放弃非素数候选人:     http://en.wikipedia.org/wiki/Fermat%27s_little_theorem