使用长参数来使用BigInteger的重构函数

问题描述

我需要转换一些使用long参数的方法,结果证明64位long太小,无法满足我的需要,我所做的就是转换这些方法,以便可以使用{{ 1}}。

这是可复制的示例:

原文:

BigInteger

已转换:

static void ConditionalSum_1(long n) {

    long soma = 0;
 
    int i = 1;
    while (i < n) {
        for (int j = 0; j < i; j++) {
            soma++;
        }
        i *= 2;
    }
    System.out.println("Soma C1 = " + soma);
}

函数调用

static void ConditionalSum_2(BigInteger n) {

    BigInteger soma = BigInteger.ZERO;

    BigInteger i = BigInteger.ONE;
    while (i.compareto(n) < 0) {
        for (BigInteger j = BigInteger.ZERO; j.compareto(i) < 0; j.add(BigInteger.ONE)) {
            soma.add(BigInteger.ONE);
        }
        i.multiply(BigInteger.TWO);
    }
    System.out.println("Soma C2 = " + soma);
}

由于某些原因,我无法查明public static void main(String[] args) { ConditionalSum_1(999999L); //works fine ConditionalSum_2(new BigInteger("999999")); //infinite loop } 函数似乎不起作用,没有抛出异常,变量似乎没有变化,因此例程进入了无限循环

我是Java的新手,所以我确定这里缺少一些基本知识。帮助将不胜枚举。

解决方法

当您将一个BigInteger与另一个BigInteger求和时,结果将返回。因此,您必须再次将返回值分配给适当的变量。

   for (BigInteger j = BigInteger.ZERO; j.compareTo(i) < 0; j = j.add(BigInteger.ONE)) 
   {
        soma = soma.add(BigInteger.ONE);
   }

   i = i.multiply(BigInteger.TWO);