1. 程式人生 > >C++解決大整數加法

C++解決大整數加法

c++解決大整數加法

問題描述:求兩個不超過200為的非負整數的和

輸入資料:輸入有兩行,每行是一個不超過200位的非負整數,沒有多於的前導0.

輸出要求:輸出只一行,即相加後的結果。結果裡不能有多於的前導0,即如果結果是342,那麼就不能輸出0342.

輸入樣例:

2222222222222222222222222

3333333333333333333333333

輸出樣例:

5555555555555555555555555

解題思路:int型別資料最多10位,double型別資料最多64位,因此,不能直接利用int或double型別資料相加求解。應考慮用陣列(為方便讀入資料,採用字元陣列),採用列豎式的思路,對位相加,在考慮進位,最終求解。

C++程式碼如下:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	//定義變數	
	char x1[200]={'\0'};//兩個不超過200位的加數
	char x2[200]={'\0'};
	int carry[201]={0};//進位
	int result[201]={0};//和
	int i;//迴圈變數
	//輸入
	cin>>x1>>x2;
	//求兩char陣列長度
	int len1=strlen(x1);
	int len2=strlen(x2);
	//反序
	strrev(x1);
	strrev(x2);
	//確定兩序列長度的最大值
	int lenmax=len1*(len1>=len2)+len2*(len1<len2);
	//把char型別的加數陣列轉化為int
	int x11[200]={0};
	for(i=0;i<=len1-1;i++)
	{
		x11[i]=x1[i]-'0';
	}
	int x22[200]={0};
	for(i=0;i<=len2-1;i++)
	{
		x22[i]=x2[i]-'0';
	}
	//不考慮進位對應位相加
	for(i=0;i<=lenmax-1;i++)
	{
		result[i]=x11[i]+x22[i];
		result[i+1]=0;//用於防止超過lenmax後的一位
	}
	//考慮進位 完成最終求和
	for(i=0;i<=lenmax+1;i++)
	{
		carry[i+1]=result[i]/10;
		result[i]=result[i]%10+carry[i];
	}
	//若最高位為0,則不輸出最高位
	if(result[lenmax]==0)
		i=lenmax-1;
	else
		i=lenmax;
	for(;i>=0;i--)
		cout<<result[i];
	cout<<endl;
return 0;
}