改进添加BigIntegers的方法

时间:2015-05-23 15:45:45

标签: java

所以今天早些时候我写了一个个人用途的方法,它总结了作为参数给出的整数:

public class BigSum {
    public static int sum(int... numbers) {
        int sum = 0;
        for(int n : numbers) {
            sum += n;
        }
        return sum;
    }
}

后来发现int值对于我的程序来说太小了,所以我切换到BigIntegers。我决定如果方法将Strings作为参数,将它们转换为BigIntegers然后对它们求和,那会更容易:

import java.math.*;

public class BigSum {
    public static BigInteger sum(String... numbers) {
        BigInteger sum = BigInteger.ZERO;
        for(String n : numbers) {
            BigInteger x = new BigInteger(n);
            sum = sum.add(x);
    }
        return sum;
}
}

这段代码的唯一问题是你需要在双引号之间给出参数(因为它需要字符串),而且它通常非常不方便。 我可以为sum方法做什么来接受这样的参数:

BigInteger NUMBER = BigSum.sum(5, 6);

而不是:

BigInteger NUMBER = BigSum.sum("5", "6");

3 个答案:

答案 0 :(得分:3)

您可以接受Object...作为参数并使用toString()方法:

public static BigInteger sum(Object... numbers) {
    BigInteger sum = BigInteger.ZERO;
    for(Object n : numbers) {
        BigInteger x = new BigInteger(n.toString());
        sum = sum.add(x);
    }
    return sum;
}
// ...
BigInteger sum1 = BigSum.sum("5", 6); // 11
// With a real big integer
BigInteger sum2 = BigSum.sum("1234567891011121314151617181920", 1);
// 1234567891011121314151617181921

如果该数字不是BigInteger的有效表示,则此代码将抛出NumberFormatException

答案 1 :(得分:1)

在您使用BigInteger检查之前,请确保您不能简单地使用long基元类型。 long类型包含比int基元类型大得多的值,并且不需要创建BigInteger对象的开销。

但是,如果您的总和将增长到超出long容量的大小,但您的各个部分确实适合long类型,那么您可以切换方法以获取{{1}的数组}值然后使用long来保存总数。这样的方法可能如下所示:

BigInteger

答案 2 :(得分:0)

你可以改变你的课程 -

public static BigInteger sum(BigInteger... numbers) {

   BigInteger sum = BigInteger.ZERO;

   for(BigInteger n : numbers) {
        BigInteger x = new BigInteger(n);
        sum = sum.add(x);
 }