大整數相乘

/*功能:完成來個大整數的相乘*/
/*
解題思路:
讀入倆個大整數,將他們分別放在倆個字符串中,申明第三個字符串用來保存結果。
其中涉及到字符和數字轉化的技巧,具體實現請看代碼。
*/
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main()
{
	string str1,str2,tem;
	int len1,len2,len3,i,j,m,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',以便讀取的時候不會越界
	len3=2*len1+2;
	char *str3 = new char[len3];
	//將str3中的內容清零
	memset(str3,'0',len3);
	str3[len3-1]=0;
	//外層循環表示乘數,內層循環表示被乘數,用乘數的各位與被乘數相乘結果保存到str3中
	for(i=len2-1;i>-1;i--)
	{
		//從str3最後一個數字位的前一位存放數字,最後一個數字位已經放上了0
		len3=len3-1;
		m=len3-1;
		//拿出被乘數的每一位與該乘數位相乘
		for(j=len1-1;j>-1;j--,m--)
		{
			n=(str2[i]-'0')*(str1[j]-'0')+(str3[m]-'0')+k;
			if(n<10)
			{
				str3[m]=n+'0';
				k=0;
			}
			else
			{
				str3[m]=n%10+'0';
				k=n/10;
			}
		}
		//在最後一次要將來自低位的進位加到str3中
		while(k>10)
		{
			str3[m]=k%10+'0';
			k=k/10;
			m--;
		}
		str3[m]=k+'0';
		k=0;
	}
	//以下功能是爲打印服務的,若前幾位是字符0,則不打印
	i=0;
	while(str3[i]=='0')
	{
		i++;
	}
	str3+=i;
	cout<<"運算結果爲:"<<str3<<endl;
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章