我写了一个代码,它返回两个素数,它们的间隙等于给定的long
,并且它们之间没有其他素数。
这些是我到目前为止所做的方法:
public static long[] firstGap(int gap, long lLimit, long uLimit) {
for(long i=lLimit; i<=uLimit; i++) {
for(long j=i+1; j<=uLimit; j++) {
if(isPrime(i) && isPrime(j) && j-i==gap && !repeatedIsPrime(i+1,j-1)) {
return new long[]{i,j};
}
}
}
return null;
}
用于检查数字是否为素数
public static boolean isPrime(long n) {
for(int i=2;i<n;i++) {
if(n%i==0) {
return false;
}
}
return true;
}
检查两个数字之间是否有素数
public static boolean repeatedIsPrime(long x, long y) {
for(long i=x; i<=y; i++) {
if(isPrime(i)) {
return true;
}
}
return false;
}
我到目前为止所做的是将循环索引设为int但后来我有一个有损转换,接下来是减少方法调用但是我找不到办法来做到这一点。到目前为止,我所取得的唯一改进是,除了没有得到任何东西之外,我已经删除了一些不必要的存储和赋值。那么如何进一步优化我的代码?
答案 0 :(得分:1)
您可以使用以下代码:
public static long[] firstGap(int gap, long lLimit, long uLimit) {
for(long i=lLimit; i<=uLimit; i++) {
if(isPrime(i)) {
long j = gap + i;
if (isPrime(j) && !repeatedIsPrime(i + 1, j - 1)) {
return new long[]{i, j};
}
}
}
return null;
}
首先,如果isPrime(i)== false,其他检查没有任何意义。其次,for(long j=i+1; j<=uLimit; j++)
可以删除,因为你只使用一个j(当j-i == gap)时
答案 1 :(得分:1)