在字符串上模拟数字加法
用字符串模拟数字加法的理由
当数字n很大时,用整型(int)甚至长整型(long)都有可能溢出,这就是我们通常要考虑的大数问题。
那我们用什么表示一个大数呢?通常用的是字符串或数组
用字符串模拟数字加法的分析
当用字符串模拟数字加法时,就是要将字符串的每一位表示成’0’~‘9’之间的某一个字符。而数字加法,无非就是在字符串的最后一位不断加1,当最后一位为10时,进位。所以用字符串模拟数字加法就是不断加1和进位的过程。
所以在程序实现的时候,需要一个进位标志nTakeOver,取值为0或1。设想一下当前数字为199,加1之后,数字变成200,这是两次进位过程,操作了三位数字。也就是说,字符串模拟数字加法时,如果遇到进位情况,应该在循环里面实现。
**那么如何实现数字末位加1呢?**首先要获取当前字符串中的末位值,这里要注意字符与数字的不同。比如说要获取字符串number中第i位的数字,那么语句应该写为:number[i]-‘0’。
现在将加1与进位结合起来。用nSum获取第i位字符所表示的数字并加上进位符。如果当前正在对末位进行加1操作,那么末位的值应该是nSum+1;如果加1后末位变成了’10’,进位符nTakeOver应设置为1,然后对末位的前一位进行操作,其值就应该为nSum。如果当前并非对末位操作,而是对第i位操作,那么第i位的值应该等于nSum,并判断nSum是否为’10’,如果是,再进行进位操作。
程序实现
public boolean increaseNum(char[] number) {
boolean isOverFlow = false;//结束标志
int nTakeOver = 0;//进位标志
for (int i = number.length-1, i >=0, i--) {
int nSum = number[i] - '0' + nTakeOver;
if (i == number.length - 1) {
nSum++;//末位加1操作
}
if (nSum >= 10) {
if (i == 0) {
isOverFlow = true;//结束
}
else {
nTakeOver = 1;
nSum -= 10;
number[i] = (char)(nSum + '0');
}
}
else {
number[i] = (char)('0' + nSum);
break;//加1完成,退出当前循环
}
}
return isOverflow;
}