如何不断增加BigInteger的价值?

时间:2016-01-12 16:15:55

标签: java biginteger

我有一系列BigInteger问题,需要不断增加BigInteger。我提出了一个循环,但由于BigIntegers和BigDecimals是不可变的,所以这非常棘手。

以下是我尝试制作的其中一个程序的示例。这是一种尝试查找大于Long.MAX_VALUE的BigIntegers可以被2或3整除的方法。

    public void divisibleBy2Or3() {
    BigInteger min = new BigInteger("9223372036854775808");
    int j = 0;
    BigInteger increment = new BigInteger("1");
    BigInteger divideBy2 = new BigInteger("2");
    BigInteger divideBy3 = new BigInteger("3");
    while (j < 10) {
        BigInteger a = min.add(increment);
        BigInteger b = a.divide(divideBy2); BigInteger c = a.divide(divideBy3);
        if (b.multiply(divideBy2) == a || c.multiply(divideBy3) == a) {
            System.out.print(a + " ");
            j++;
        }
    }
}

这段代码的问题是我似乎无法弄清楚如何获取我正在为循环的每次迭代测试的BigInteger,以便在每次迭代时添加自己。我还不确定多重方法是否真的适用于这种情况,因为每当我运行程序时,它都会挂起并显示一个空白的控制台

2 个答案:

答案 0 :(得分:0)

您需要使用在循环外声明的变量来跟踪当前值 - 否则它将继续返回min + 1

static final BigInteger ONE = BigInteger.ONE;
static final BigInteger TWO = ONE.add(ONE);
static final BigInteger THREE = TWO.add(ONE);

public void divisibleBy2Or3() {
    BigInteger min = new BigInteger("9223372036854775808");
    int j = 0;
    // Add this.
    BigInteger value = min;
    while (j < 10) {
        value = value.add(ONE);
        BigInteger b = value.divide(TWO);
        BigInteger c = value.divide(THREE);
        if (b.multiply(TWO).equals(value) || c.multiply(THREE).equals(value)) {
            System.out.print(value + " ");
            j++;
        }
    }
}

答案 1 :(得分:-1)

为什么你甚至需要搜索这些数字?
只是一些纸笔计算显示了一个简单的数字属性,可以被2或3整除,它们的顺序是任意起始数x可以被2和3整除:

x  x + 2  x + 3  x + 4  [x + 6
                        //the repetition starts here

使用此功能,我们可以轻松生成符合约束条件的数字:

//x mod 3 = 2
BigInteger x = new BigInteger("9223372036854775808");
BigInteger[] next_add = new BigInteger[]{
    BigInteger.ONE,
    BigInteger.ONE,
    new BigInteger("2"),
    new BigInteger("2")
};

//generate and print matching integer
for(int i = 0 ; i < searchedNumber ; i++){
    x = x.add(next_add[i % 4]);
    System.out.println(x);
}

一般提示:使用x % divBy == 0代替(x / divBy) * divBy == x检查可分性,以提高效率和可读性。

此代码的优点在于,与您的代码相比,只有2/3的循环周期用于相同数量的搜索值,并且不需要昂贵的可分性检查。