【发布时间】:2019-10-05 13:10:06
【问题描述】:
这是一个获取素数的代码,我已经尽可能地提高了它的效率,但问题是我不能将它转换为 BigInteger,只要不能保存那么多信息;这里是代码:
public class p3{
static long perfectNumber;
static long mersenne;
public static void main(String[] args) {
long p = 2;
while (true) {
if( p % 2 == 0&&p!=2){
p++;
}
else{
if (isPrime(p) == true) {
mersenne = (long) (Math.pow(2, p) - 1);
if (isPrime(mersenne) == true) {
perfectNumber = (long) Math.pow(2, (p - 1)) * mersenne;
System.out.println(perfectNumber);
}
}
p+=1;
}
}
}
private static boolean isPrime(long testPrime) {
for (long i = 3; i < Math.sqrt(testPrime); i += 2) {
if (testPrime % i == 0) {
return false;
}
}
return true;
}
}
【问题讨论】:
-
您遇到了什么问题?
-
你看过它的文档了吗? BigInteger
-
首先问题不是那么长,无法保存足够的信息。它可以容纳19位数字,超过100,000万亿。没有足够的时间使用您的算法甚至筛子来计算这种数量级的素数。但是,使用
BigInteger将让您使用复杂的isProbablePrime方法。因此,请阅读建议的文档并进行简单的更改。 -
@Goion 我需要将其转换为 BigInteger,只要对于完美数字来说还不够
-
注意WJS写的。在
p大于单个字节之前,您的isPrime()方法将永远持续下去,更不用说长了。已知最大的梅森素数是 p = 82,589,933。
标签: java biginteger perfect-numbers