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
。。。