#include<iostream>
#include<string>
using namespace std;
string sumgreat(string a,string b)
{
if(a=="")
return b;
if(b=="")
return a;
//比較兩個字符串的長度,長度相差gap,將較短的高位串填充gap個0達到相同長度,便於統一比較操作
int sizea=a.length();
int sizeb=b.length();
int gap=0;
if(sizea>sizeb)
{
gap=sizea-sizeb;
b.insert(b.begin(),gap,'0');//在b串開頭處插入gap個‘0’
sizeb=b.length();//因爲填充後字符串長度改變,所以要更新sizeb的值
}
if(sizea<sizeb)
{
gap=sizeb-sizea;
a.insert(a.begin(),gap,'0');
sizea=a.length();
}
//將求和結果保存在result中
string result="";int c=0;int i=0;int j=0;//c表示進位值,取值0或者1,0表示無相加不進位,1表示進位
for(i=sizea-1,j=sizeb-1;i>=0||j>=0;i--,j--)
{
int num1=a[i]-'0';//將字符a[i]轉換爲數字,例如‘2’->2;
int num2=b[j]-'0';
int sum=num1+num2+c;
c=sum/10;//計算進位值,逢10進位
result.insert(result.begin(),sum%10+'0');//sum%10計算本位值,即同位數字相加後該位置的值
//最高位在字符串開頭,因爲字符串已經對齊,所以i和j始終相等,當達到i==j==0時要判斷是否有進位
//若有進位需要在結果的最高位填充‘1’
if(i==0&&c==1)
result.insert(result.begin(),'1');
}
//注意函數有返回值
return result;
}
int main()
{
string a,b;
while(cin>>a>>b)
{
cout<<sumgreat(a,b)<<endl;
}
return 0;
}
注意事項:
1.雖然上述代碼稍微繁複,但是便於理解,步驟清晰(因爲沒優化,看起來很不簡潔),建議理解後閱讀下述代碼;
2.上述程序的關鍵在於字符串對齊(高位補0使長度一樣)和最高位進位處理
/*---------------------------------------
* 日期:2015-06-28
* 作者:SJF0115
* 時間:2014
* 題目:大數求和
* 來源:華爲上機
-----------------------------------------*/
#include <iostream>
#include <string>
using namespace std;
string Add(string a,string b){
int size1 = a.size();
if(size1 == 0){
return b;
}//if
int size2 = b.size();
if(size2 == 0){
return a;
}//if
// 進位
int c = 0,num1,num2,sum;
string result = "";
for(int i = size1 - 1,j = size2 - 1;i >= 0 || j >= 0 || c > 0;--i,--j){
num1 = i >= 0 ? a[i] - '0' : 0;
num2 = j >= 0 ? b[j] - '0' : 0;
sum = num1 + num2 + c;
c = sum / 10;
result.insert(result.begin(),sum % 10 + '0');
}//for
return result;
}
int main(){
string a;
string b;
while(cin>>a>>b){
cout<<Add(a,b)<<endl;
}//while
return 0;
}
注意事項:
上述程序的設計精妙之處在於for循環,要多加理解和應用
題目:
描述:
給定兩個非常大的正整數A和B,位數在50至100之間。求C=A+B;
題目類別: 字符串
難度: 中級
運行時間限制: 10Sec
內存限制: 128MByte
階段: 入職前練習
輸入:
因爲A和B很大,從高位到低位,以字符串的形式輸入兩行數字A和B。A和B的位數在50至100之間。
輸出:
以字符串形式,輸出一行,表示A和B的和。
樣例輸入:
11111111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222222
樣例輸出:
33333333333333333333333333333333333333333333333333
參考了Yoona的文章http://blog.csdn.net/sunnyyoona/article/details/46675553