加法操作中无进位时直接对最后一位进行操作谁都会,但是设计到进位时大家很容易就晕头转向了,但只要认真捋一捋就会发现并没有那么复杂。
加法操作可以分为两个部分来处理:
- 最后一位加法
- 剩余位的进位
假设没有进位的话我们可以这样做(这里按加1来举例):
char[] cnum = new char[]{'1', '9', '0', '9', '0'};
// 直接对最后一位加1
cnum[lastIndex] = (char) (cnum[lastIndex] + 1);
但如果有进位的话,我们至少应当在把最后一位加了之后把进位提取出来暂存:
char[] cnum = new char[]{'1', '9', '0', '9', '9'};
int carry = 0;
int lastIndex = 4;
// 首先判断是否产生了进位
int temp = cnum[lastIndex] - '0' + 1;
// 有进位就将进位提出来,个位也修改
if (temp >= 10) {
carry = temp / 10;
temp -= 10;
}
cnum[lastIndex] = (char) (temp + '0');
这么一来加法就完成一半了,剩余的一半就是考虑如何将进位向上逐个传递。自然逐个传递是需要循环遍历的,只要还有进位就一直传:
// 第二步 进位
while (carry != 0) {
lastIndex--;
int t = cnum[lastIndex]-'0'+carry;
if (t >= 10) {
carry = t/10;
t -= 10;
} else {
carry = 0;
}
cnum[lastIndex] = (char) (t+'0');
}
这里进位的传递又等价于第一步的加1操作,将进位作为被加数在每一位上重复第一步操作直到不再有进位为止即可。
以下是完成代码:
char[] cnum = new char[]{'1', '9', '0', '9', '9'};
// 第一步 加1
int carry = 0;
int lastIndex = 4;
int temp = cnum[lastIndex] - '0' + 1;
if (temp >= 10) {
carry = temp / 10;
temp -= 10;
}
cnum[lastIndex] = (char) (temp + '0');
// 第二步 进位
while (carry != 0) {
lastIndex--;
int t = cnum[lastIndex]-'0'+carry;
if (t >= 10) {
carry = t/10;
t -= 10;
} else {
carry = 0;
}
cnum[lastIndex] = (char) (t+'0');
}
总结
对于复杂问题要尝试着一步步来,由简到繁,就会发现问题其实并不复杂。对于加法运算的个位加法实际上就是最后一位的加法和其余位的进位。