Java - 转换为BigInteger

时间:2015-02-17 03:24:19

标签: java biginteger

我建立了一个程序来找出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); }
    }}}

3 个答案:

答案 0 :(得分:1)

虽然,piotrek的答案将解决您的一个问题,但您的计划仍然无法正常工作。

需要做的事情:

  1. 请勿使用==进行比较。它不适用于非基元,例如BigInteger(piotrek)
  2. i.subtract(one)作为循环中的最后一项无效。使用i = i.subtract(one)j的等效内容。
  3. 会很好:

    虽然技术上正确,a.compare(b) == -1a.compare(b) == +1通常不是代码可读性的最佳做法,但compare可能不会在所有情况下返回这三个值中的一个,所以不要养成这个习惯。请改用a.compare(b) < 0a.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; 
    }
}