要求实现明显超过整型以及其他计量的整数范围的减法。如有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();
}
}











网友评论