前言:
在做面试题目时,我们经常看到有这样的题目:将两个很大的数相加,超过100位。
网上可以看到很多答案,但是这些答案大部分都是没有考虑负数的情况。
首先我们已经不能直接用long类型进行表示了。一般输入是两个字符串。最后输出也得是一个字符串。
思路:
对于字符串是无法相加的,那就必须转换成整形数组。然后一位一位的相加。
当然我们得考虑进位的情况。ok,那么负数怎么解决的,这。里想到了计算机组成里面的运算方法。计算机是将整数以补码的方式保存的,这就很好的将减法变为了加法。最后只需要一个加法器就可以进行加减法了(负数相当于减法)。
我们知道计算机的整数二进制保存的,首位是符号位,0代表正,1代表负。求补码是正数补码等于源码,负数补码等于除符号位外取反后加1.。
10进制补码
这里我们的数是10进制,我们也可以模拟其求补码,具体方法是:我们符号位用0表示正,9表示负(必须是9)。正数和二进制一样,负数用9-i;最后整个数+1。模拟加法器
要保证加法器能运行,那么两个数组的长度必须一致,类似于计算机的32位只能和32位相加,而不能兼容64位。这也保证了首位是符号位。
这样具体实现就很简单了,从最右边开始相加,若有进位就把进位记录下来,下一位相加时把进位加上。- 其他内容
- 字符串转换为数组
用‘-’代表负数,先处理好‘-’,然后取字符串最大的长度+2(+2的原因是一位保存符号位,一位是用来进位。)。然后就是字符转换数字了。 - 结果输出
加法器返回的是补码的数组,那么要输出字符串,先求原码(补码的补码是原码),再处理正负,负显示‘-’。去掉前面的0。
- 字符串转换为数组
下面是源码
package com.suanfa;
/**
* @author 作者 E-mail: yufemgg@gmail.com
* @date 创建时间:2016-4-9 上午10:21:33
* @version 1.0
* @Description:
*/
public class LongAdd {
/**
* 加法器,a,b的位数必须相同,首位为符合位,0代表正,9代表负
* @param a
*