Java 一种添加大整数方法的改进

Java 一种添加大整数方法的改进,java,Java,今天早些时候,我写了一个用于个人用途的方法,对作为参数给出的整数求和: public class BigSum { public static int sum(int... numbers) { int sum = 0; for(int n : numbers) { sum += n; } return sum; } } 后来,我发现int值对于我的程序来说太小了,所以我切换到了bigInt

今天早些时候,我写了一个用于个人用途的方法,对作为参数给出的整数求和:

public class BigSum {
    public static int sum(int... numbers) {
        int sum = 0;
        for(int n : numbers) {
            sum += n;
        }
        return sum;
    }
}
后来,我发现int值对于我的程序来说太小了,所以我切换到了bigInteger。我决定,如果该方法将字符串作为参数,将其转换为大整数,然后对其求和,则会更容易:

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);
public static BigInteger sum(long... numbers) {
    BigInteger total = BigInteger.ZERO;
    for(long number : numbers) {
        total = total.add(BigInteger.valueOf(number));
    }
    return total;
}
而不是:

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

你可以这样改变你的课程-

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

   BigInteger sum = BigInteger.ZERO;

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

你可以这样改变你的课程-

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

   BigInteger sum = BigInteger.ZERO;

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

您可以接受
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

您可以接受
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

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

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

BigInteger NUMBER = BigSum.sum(5, 6);
public static BigInteger sum(long... numbers) {
    BigInteger total = BigInteger.ZERO;
    for(long number : numbers) {
        total = total.add(BigInteger.valueOf(number));
    }
    return total;
}

在使用
biginger
之前,请检查以确保不能简单地使用
long
原语类型。
long
类型比
int
原语类型保存的值大得多,并且不需要创建
biginger
对象的开销

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

BigInteger NUMBER = BigSum.sum(5, 6);
public static BigInteger sum(long... numbers) {
    BigInteger total = BigInteger.ZERO;
    for(long number : numbers) {
        total = total.add(BigInteger.valueOf(number));
    }
    return total;
}


您可以使用
long
double
biginger
literal没有语法。您可以选择
long
double
。没有
BigInteger
literal的语法不方便那么我肯定他们会发现
BigSum.sum(biginger.valueOf(“5”)、biginger.valueOf(“6”)
更不方便。
biginger x=new biginger(n)什么?您从现有的
biginger
创建一个新的
biginger
,因为…?如果OP找到
BigSum.sum(“5”,“6”)不方便那么我肯定他们会发现
BigSum.sum(biginger.valueOf(“5”)、biginger.valueOf(“6”)
更不方便。
biginger x=new biginger(n)什么?你从一个现存的<代码> BigInteger < /代码>中创建了一个新的<代码> BigInteger <代码>,因为……我确实考虑了很久,但是它的范围对于我来说还是太小了。我需要一种可以存储50位左右数字的东西。@shooqie然后你必须使用
String
。如果你想输入
sum
方法的组件不能保存在
long
中,那么你需要将
String
文本或
biginger
对象传递给该方法。因此,您不能简单地使用参数调用方法,这些参数是您希望的基本类型。请编辑你的问题来澄清这一点,因为目前还不清楚。我确实考虑了很久,但是它的范围对于我来说还是太小了。甚至对于部件而言,是的,我需要一种可以存储50位左右数字的东西。@shooqie然后你必须使用
String
。如果你想输入
sum
方法的组件不能保存在
long
中,那么你需要将
String
文本或
biginger
对象传递给该方法。因此,您不能简单地使用参数调用方法,这些参数是您希望的基本类型。请编辑您的问题以澄清这一点,因为它不清楚。这将要求
sum
方法的参数为字符串文字,这正是OP要求避免的。它工作得很好,但编译器拒绝添加超出
int
范围的值。对象不能大于
int
?我不明白。@Bobulus不,你可以随意传递字符串或int。我添加了一个例子。没关系:结果是组件太大了,根本无法保存在基本类型中。是的。如果整数大于
2^31-1
,则不能将其表示为
int
。这就是为什么
biginger
接受
String
…这将要求
sum
方法的参数是字符串文本,这正是OP要求避免的。它工作得很好,但编译器拒绝添加超出
int
范围的值。对象不能大于
int
?我不明白。@Bobulus不,你可以随意传递字符串或int。我添加了一个例子。没关系:结果是组件太大了,根本无法保存在基本类型中。是的。如果整数大于
2^31-1
,则不能将其表示为
int
。这就是为什么
biginger
接受
String
。。。