最近写了一个大数相乘和相加的程序,结果看起来是对的。不过期间的效率可能不是最好的,有些地方也是临时为了解决问题而直接写出来的。
可以大概说一下相乘和相加的解决思路(当然,大数操作基本就是两个字符串的操作了):
一、思路:
在操作大数前,一定会有一些异常判断,比如输入的字符串是否合法(是否是纯数字?是否为空?等等),然后才是具体的操作实现:
1、大数相加(大体思路:将大数相加问题,转换成十以内的两数相加):
①申请合适的空间,一般可以认定,两个数字相加时,长度至多是最长的数的长度或最长的数的长度加1;
②从个位(字符串中就是从最后一位)开始,进行逐位相加;
③每位相加后,立即判断是否有进位,再将本次计算的个位数字记录到result字符串中;
④当短字符串过完后,按照同样的方式,过完长字符串的剩余数字;
⑤长字符串过完后,判断是否存在进位,如果有,则最后再赋值到result字符串中,如果没有,则最后将0(也就是结束符)赋值到result字符串中;
⑥由于操作的result字符串是倒置操作的,最后再把字符串逆置,返回即为两数相加结果;
2、大数相乘(大体思路:将大数相乘问题,转换成十以内的两数相乘):
①按照一般的两数相乘的思路,运算过程中,会产生一个二维数组样式的中间结果(准确点是一个字符串数组),数组的行数是第二个数字的个数;
②每次得出这个字符串数组的一行的结果,具体为:
a、针对这个字符串数组,每次运算前,申请合适的空间,一般可以认定,一个数和一个十以内的数字相乘时,长度至多是该数的长度或该数长度加1;但是还有一点需要考虑到,从十位开始,数字相乘后,默认是在最后加0的,规律为十位对应1个0,百位对应2个0,以此类推。因此需要申请的空间除了该数的长度加1外,还需要加上本次操作需要额外增加的0的个数;
b、在数字真正相乘前,需要将对应的0进行补齐(即个位数相乘时增加0个0,十位数相乘时增加1个0 ... ... )
c、每次取出第二个数的一个数字,取出顺序为倒序(从个位开始),然后与第一个数字进行逐位相乘;