我在尝试用Java中的carrys减去时遇到了问题。
public BigInt add(BigInt o) {
int carry = 0;
int max = n.length > o.n.length ? n.length : o.n.length;
int[] result = new int[max+1];
for (int i = 0; i <= max; ++i) {
int top = i < n.length ? n[i] : 0;
int bot = i < o.n.length ? o.n[i] : 0;
result[i] = (top + bot + carry) % 10;
carry = (top + bot + carry) / 10;
}
return new BigInt(trim(result));
}
public BigInt sub(BigInt o) {
int carry = 0;
int max = n.length > o.n.length ? n.length : o.n.length;
int[] result = new int[max+1];
for (int i = 0; i <= max; ++i) {
int top = i < n.length ? n[i] : 0;
int bot = i < o.n.length ? o.n[i] : 0;
carry = (top + bot + carry) / 10;
result[i] = (10 + top - bot - carry) % 10;
}
return new BigInt(trim(result));
}
我不知道自己做错了什么?我的加法课很完美,但减法给了我一个奇怪的答案。让我们说如果我减去5943-3952生病得到2091.当我们知道答案是1991年时。我的所有答案都只是前2位数字不正确。救命!!!!
答案 0 :(得分:0)
您的代码存在很多问题,但首先会提供所需的结果:
public BigInt sub(BigInt o)
{
int carry = 0;
int max = n.length > o.n.length ? n.length : o.n.length;
int[] result = new int[max+1];
for (int i = 0; i <= max; ++i)
{
int top = i < n.length ? n[i] : 0;
int bot = i < o.n.length ? o.n[i] : 0;
int res = top - bot - carry;
result[i] = (10 + res) % 10;
carry = res < 0 ? 1 : 0;
}
return new BigInt(trim(result));
}
但请注意,您不会考虑左操作数可能小于右操作的事实,因此您会得到否定结果。在将BigInt表示为&#34;数字&#34;数组时,似乎并不是表示负值的方法。如果有的话,我也不会看到它。
如果您也有负值,则有四种情况: