我建立了一个程序来找出2 ^ 1000的最大素数因子。它工作正常,并给出了我较小的测试数字的正确答案,但后来我意识到,对于我的数字,我将不得不使用BigInteger。我之前从未使用它,所以我很确定我做错了什么。 BigInteger程序没有给我任何东西,也没有完成运行。
这是使用原始数据类型的程序:
public class PE3 { public static void main(String[] args) {
int num = 13195;
//find factors of 'num'
for (int i=(num); i>2; i--) {
if ((num%i)==0)
testPrime(num, i);
}
}
// find if factor is prime
public static void testPrime(int num, int i){
for (int j=2; j<i; j++) {
if ((i%j)==0)
break;
if (j==(i-1))
System.out.println(i);
}
}}
这里(我认为是)使用BigInteger的相同程序:
import java.math.BigInteger;
public class PE3BI { public static void main(String[] args) {
BigInteger num = new BigInteger("600851475143");
BigInteger zero = new BigInteger("0");
BigInteger one = new BigInteger("1");
BigInteger two = new BigInteger("2");
//find factors of 'num'
for (BigInteger i = new BigInteger("600851475143"); i.compareTo(two)==1; i.subtract(one)) {
if ((num.mod(i))==zero)
testPrime(num, i, one, zero);
}
}
// find if factor is prime
public static void testPrime (BigInteger num, BigInteger i, BigInteger one, BigInteger zero){
for (BigInteger j = new BigInteger("2"); j.compareTo(i)==-1; j.subtract(one)) {
if ((i.mod(j))==zero)
break;
if (j.compareTo(i.subtract(one))==0)
{System.out.println(i);
System.exit(0); }
}}}
答案 0 :(得分:1)
虽然,piotrek的答案将解决您的一个问题,但您的计划仍然无法正常工作。
需要做的事情:
==
进行比较。它不适用于非基元,例如BigInteger
(piotrek)i.subtract(one)
作为循环中的最后一项无效。使用i = i.subtract(one)
和j
的等效内容。会很好:
虽然技术上正确,a.compare(b) == -1
和a.compare(b) == +1
通常不是代码可读性的最佳做法,但compare
可能不会在所有情况下返回这三个值中的一个,所以不要养成这个习惯。请改用a.compare(b) < 0
和a.compare(b) > 0
。
答案 1 :(得分:0)
你无法进行object == zero
之类的比较。它仅适用于基元。现在,您的数字是对象,因此它会检查引用是否相同。将其更改为比较或等于
答案 2 :(得分:0)
使用long而不是BigInteger类可能更好吗?
我刚用你的代码来检查一个数字是否为素数:
long num = 600851475143L;
boolean prime = true;//Check this after for loop for prime.
for (long i=2; i<num; i++) {//Loops through all numbers between 2 and the number given to test.
if ((num%i)==0){//This is true if number is not prime.
prime = false;
System.out.println("Not prime: " + i);
break;
}
}