问题描述:
计算机计算的数值位是有限的,当要计算两个不少位的数之和时,直接输入后是不能直接进行运算,因此要编写程序来模拟加法的运算过程,这样即便是两个成百,成千的位的数相加也是能够运算出来的. ios
基本思路:大数加法是使用字符串来存储大数,并逐个按照位数相加;a串和b串可能含有前导0,因此substr()函数和find_first_not_of('0')函数除去前导0,使用reverse()函数将a串和b串反转以便后面从最低位开始运算,ans串存放的是最终结果,而后从最低位开始将ans串和b串相加,tem是上一位的进位,最终的ans串反转为从高位到低位的顺序.ide
下面是一个大数加法的模板函数
#include<iostream> #include<string> #include<algorithm> using namespace std; string add(string a,string b) { //除去字符串前面的前导0 a=a.substr(a.find_first_not_of('0')); b=b.substr(b.find_first_not_of('0')); int lenA = a.length(); int lenB = b.length(); int len = max(lenA,lenB)+10; //将a串和b串反转,从最低位开始运算 reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); string ans(len,'0'); //将a串拷贝到ans串 for(int i = 0;i < lenA;++i) ans[i]=a[i]; //tem是上一位的进位 int tem=0; for(int i = 0;i < len;i++) { if(i<b.length()) tem += (ans[i]-'0')+(b[i]-'0'); else tem += (ans[i]-'0'); ans[i] = tem % 10 +'0'; tem /= 10; } //ans串和b串是从最低位开始运算,因此要将ans串反转从最高位到最低位 reverse(ans.begin(),ans.end()); //前面可能存在多余的前导0,返回以前截掉 return ans.substr(ans.find_first_not_of('0')); } int main() { string a ="00001234"; string b ="0005678"; cout<<add(a,b)<<endl; return 0; }
结果截图:spa