(大数乘法)两个至多长度为100的数字相乘

模拟,竖式计算乘法。

没有测试效率。欢迎更好的高精度乘法。

#include <iostream>

#include <memory.h>

using namespace std;

char a[100],b[100];//a是乘数,b是被乘数 

int len_a,len_b;//a,b的长度 

int c[205];//c为结果的存储 

void mul(char a[],char b[],int l_a, int l_b)

{

	int i,j;

	for(i = l_a-1;i >= 0; i--)

	{

		for(j = l_b - 1; j >= 0; j--)

		{

			c[i+j+2] =  c[i+j+2] + (a[i] -'0') * (b[j] - '0');

			//计算乘数a的第i位与被乘数的每一位相乘之后存放在对应的数组位置上

			//然后计算每一位上数字的和 

			//这个操作比较好,保证了相乘之后相加形成了错位,

			//易于进行C[]每一位相加操作 

		}

	}

	for(i = l_a+l_b; i >= 0; i--)

	{

		//将每一位数字上确保是<10的数字 

		c[i-1] = c[i-1] + c[i]/10;

		c[i] = c[i] % 10;

	} 

	bool  flag = true;//标记是不是0*0 

	//找到第一个不为0的数字输出,屏蔽前导0 

	i = 0;

 

	while(c[i] == 0)

	{

		i++;

	}

	for(;i<=l_a+l_b;i++)

	{

		flag = true;

		cout<<c[i];

	}

	if(!flag) cout<<"0"; 

	cout<<endl; 

}

int main()

{

	while(cin>>a>>b)

	{

		len_a = strlen(a);

		len_b = strlen(b);

		memset(c,0,sizeof(c));

		mul(a,b,len_a,len_b);	

	}

}

 

你可能感兴趣的:(数字)