大整数相乘

/*功能:完成来个大整数的相乘*/

/*

解题思路:

读入俩个大整数,将他们分别放在俩个字符串中,申明第三个字符串用来保存结果。

其中涉及到字符和数字转化的技巧,具体实现请看代码。

*/

#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--)

		{

			int a1=str2[i]-'0';

			int a2=str1[j]-'0';

			int a3=str3[m]-'0';

			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;

}


你可能感兴趣的:(大整数相乘)