我正在尝试从BigInteger类实现我自己的add()方法版本。到目前为止,当给定两个相同长度的数字时,它完美地工作,但是当给定两个不同长度的数量时,它无法编译(索引越界)。什么是解决这个问题的最佳方法?
如果有帮助,当添加的两个值为10时,输出为20。
public BigInt add(BigInt b) {
int[] ans = new int[value.length];
int carry=0;
if(this.lessThan(b))
for(int i=b.value.length-1;i>=0;i--){
int result=this.value[i]+b.value[i]+carry;
carry=result/10;
result%=10;
ans[i]=result;
}
else
for(int i=this.value.length-1;i>=0;i--){
int result=this.value[i]+b.value[i]+carry;
carry=result/10;
result%=10;
ans[i]=result;
}
String ANSsz=convertArrayToString(ans);
BigInt Sum = new BigInt(ANSsz);
return Sum;
}
答案 0 :(得分:0)
如果我正确理解您的代码,ans
长度必须大于两个BigInt
长度中的较大者。您的ans
只能与调用该方法的对象一样大。
答案 1 :(得分:0)
我会尝试这样的事情:
public BigInt add2( BigInt b )
{
int answerLength = Math.max( b.value.length, this.value.length ) + 1;
int[] answer = new int[ answerLength ];
BigInt bigger = this;
BigInt smaller = b;
if( this.lessThan( b ) )
{
bigger = b;
smaller = this;
}
// copy the bigger value into answer
for( int i = bigger.value.length - 1; i >= 0; i-- )
{
answer[ i + 1 ] = bigger.value[ i ];
}
// add the smaller into the answer
int carry = 0;
int lengthOffset = answerLength - smaller.value.length;
for( int i = smaller.value.length - 1; i >= 0; i-- )
{
int result = answer[ i + lengthOffset ] + smaller.value[ i ] + carry;
carry = result / 10;
result %= 10;
answer[ i ] = result;
}
answer[ 0 ] = carry;
String ANSsz = convertArrayToString( answer );
BigInt Sum = new BigInt( ANSsz );
return Sum;
}
答案 2 :(得分:0)
这真是一个非常奇怪的解决方案。首先它有明显的溢出问题(两个添加的int的结果可能不适合int本身)并且我不知道为什么我们想要除以10除以简单的2个数字 - 这实际上只是将数字转换为十进制字符串所必需的。
无论如何只要考虑两个数字的乘积可以有多少位数。为简单起见,我们在base10中尝试这一点,但概括很明显:
k长数字最多10^k - 1
大。因此,如果我们有一个带有n位数的数字和一个带有m的数字,则结果最多为:10^n - 1 + 10^m - 1 = 10^n + 10^m - 2
。我们得到的最大值是n == m,相当于10 ^ n * 2 - 2,明显小于10 ^(n + 1)。这意味着该数字最多比两者中的较大数字多一个数字(也适用于基数2)。