大数问题是指操作数超过了计算机常用数据类型的存储范围,常常是用字符串来模仿整数相加和相乘运算来实现的,在模拟的过程中要注意考虑进位和边界条件。
1、大整数相加
先看一下加法的计算过程,如456+56789
456
56789
---------
57245
计算过程是从低位往高位开始计算,计算过程要加上进位,如,计算到5+8的时候要加上前面的进位1,得到14,然后14对10取余作为对应结果的第2位,进位为14对10取正,这样一直计算,直到有一个字符串结束,然后考虑进位和没计算完的另一个字符串相加。
边界条件:
两个大整数相加,结果的长度可能与两个数中长度较大的一个相等,也可能比其大1(进位造成),如123+12=135,123长度为3,12长度为2,结果长度为3,再如99+1=100,结果长度为3比99的长度还大1。
考虑到这样的边界条件,在申请内存的时候需要对结果至少申请长度较大的那个还要大1。
代码如下:
#include<iostream> #include<string> using namespace std; //字符串倒置 void reverse(char *str) { int len=strlen(str); for(int i=0;i<len/2;i++) { char temp=str[i]; str[i]=str[len-i-1]; str[len-i-1]=temp; } } //大数求和 void bignumsum(char * ope1,char * ope2,char * result) { reverse(ope1); reverse(ope2); int len1=strlen(ope1); int len2=strlen(ope2); int max=len1; if(max<len2) { max=len2; } memset(result,'0',max+1); result[max+1]='