要求实现明显超过整型以及其他计量的整数范围的减法。如有a,b的大型整数,规定了a>=b
,求两个数相减的结果。代码如下,通过处理字符串,用字符的相减来实现,需要考虑几个边界条件。
其中,输入为a-b的格式,如:11111-2222,Linux下可以通过bc命令验证结果是否正确。首先处理输入数据,用除号拆分。再判断是否相等,相等直接返回,否则再做处理。
因此已知a>b
,则len(a)>=len(b)
,记录两个标记位idxA
、idxB
和一个借位标记k
,在被减位小于等于减数时组合运算,以长度小的idxB
为截止条件,依次从末尾比较。
1)当a当前位减去借位大于等于b当前位,下次不需要借位,k=0,结果为v(注意这里的处理是因为两个当前位相等且借位为1的情况,会使结果为-1);
2)当前需要借位,对应位相减同时加10,注意也要减去之前是否借位,结果为v;
如果len(a)>len(b)
,还得继续将a的剩余位数拼接到结果里,另外如果需要借位,即k==1
,需要减一,并令k=0
;
最后,如果结果翻转后,首位为0,去除所有在首位的0,返回最终结果。
private static String minus(String line) {
String[] strings = line.split("-");
String a = strings[0];
String b = strings[1];
if (a.equals(b)) {
return "0";
}
//a > b
StringBuilder builder = new StringBuilder();
int k = 0;
int v;
int idxA = a.length() - 1;
int idxB = b.length() - 1;
while (idxB>=0) {
char chB = b.charAt(idxB--);
char chA = a.charAt(idxA--);
if (chA - k >= chB) {
v = chA - chB - k;
k = 0;
} else {
v = chA - chB + 10 - k;
k = 1;
}
builder.append(v);
}
for (int i = idxA - idxB - 1; i >= 0; i--) {
if (k == 1) {
builder.append((char) (a.charAt(i) - 1));
k = 0;
} else {
builder.append(a.charAt(i));
}
}
StringBuilder builder1 = builder.reverse();
if (builder1.charAt(0) == '0') {
while (builder1.charAt(0) == '0') {
builder1.delete(0, 1);
}
return builder1.toString();
} else {
return builder1.toString();
}
}