我想找到两个数字之间的素数,然后说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,则需要花费大量时间如何改进算法。
谢谢
答案 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