- 讀入倆個大整數,將他們分別放在倆個字符串中,申明第三個字符串用來保存結果。
- 從倆個字符串的末位開始相加,若大於10則向前進一位,他們的模數作爲該位的結果,若不大於10,直接將該數做爲結果,
其中涉及到字符和數字轉化的技巧,具體實現請看代碼。
/*功能:完成來個大整數的相加*/
/*
解題思路:
讀入倆個大整數,將他們分別放在倆個字符串中,申明第三個字符串用來保存結果。
從倆個字符串的末位開始相加,若大於10則向前進一位,他們的模數作爲該位的結果,若不大於10,直接將該數做爲結果,
其中涉及到字符和數字轉化的技巧,具體實現請看代碼。
*/
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main()
{
string str1,str2,tem;
int len1,len2,i,j,n;
cout<<endl<<" *******************該程序完成倆個大整數的相加***********************"<<endl;
cout<<"輸入第一個大整數:\n";
cin>>str1;
cout<<"輸入第二個大整數:\n";
cin>>str2;
//分別求出倆個大整數的長度
len1=str1.size();
len2=str2.size();
//將位數高的字符串放到str1中,將位數低的字符串放到str2中
if(len1<len2)
{
tem=str1;
str1=str2;
str2=tem;
i=len1;
len1=len2;
len2=i;
}
//k中保存來至低位的進位,開始的時候應該爲0
int k=0;
//str3中保存相加後的結果,將str3申明爲最大數字位數加2,其中最後一位用來作爲標誌位,保存的是'\0',以便讀取的時候不會越界
//倆個n位的數字位相加,其結果不會超過n*10=10n,即不會超過n+1位,所以用餘下的n+1位來保存相加後的結果
char *str3 = new char[len1+2];
//將str3中的內容清零
memset(str3,0,len1+2);
//該for循環實現了逐位相加的效果,注意循環的條件
for(i=len1-1,j=len2-1;i>-1 && j>-1;i--,j--)
{
//將字符轉化爲數字判斷n的大小
n=(str1[i]-'0')+(str2[j]-'0')+k;
if(n<10)
{
//將數字再次轉化爲字符保存在str3中
str3[i+1]=n+'0';
k=0;
}
else
{
str3[i+1]=n%10+'0';
k=n/10;
}
}
//位數少的字符可能已經完成運算,但是位數多的字符串可能還存在沒有運算的位數,while就是解決這個問題的
while(i>-1)
{
n=str1[i]-'0'+k;
if(n<10)
{
str3[i+1]=n+'0';
k=0;
}
else
{
str3[i+1]=n%10+'0';
k=n/10;
}
i--;
}
//在最後一次要將來自低位的進位加到str3中
str3[i+1]=k+'0';
//以下功能是爲打印服務的,若前幾位是字符0,則不打印
i=0;
while(str3[i]=='0')
{
str3++;
i++;
}
cout<<"運算結果爲:"<<str3<<endl;
return 0;
}