問題描述:
計算機計算的數值位是有限的,當要計算兩個不少位的數之和時,直接輸入後是不能直接進行運算,因此要編寫程序來模擬加法的運算過程,這樣即便是兩個成百,成千的位的數相加也是能夠運算出來的.
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