高精度之大数乘大数

上一篇说了简单的大数乘以小数的问题,绝大多数的问题解决不了。

现在我们来说一下大数乘以大数。

大数乘以大数也是用来模拟手算。

举个例子吧!


先从个位开始一个一个的乘 乘完个位然后再乘十位,乘十位的时候要和个位的想成的结果相加。

这里注意乘十位的时候 就不要和乘个位数字的结果中的最后一位相加了 。就是如图搓位。

就是这样 。

下面先贴上我的代码。

#include<iostream>
#include<string.h>
using namespace std;

void mult(char a[],char b[])
{
	int alen = strlen(a);
	int blen = strlen(b);
	if(alen%2)
	{
		for(int i=0;i<=alen/2;i++) 
		{
			int t = a[i]-'0';
			a[i]=a[alen-1-i]-'0';
			a[alen-1-i]=t;
		}
	}
	else
	{
		for(int i=0;i<alen/2;i++) 
		{
			int t = a[i]-'0';
			a[i]=a[alen-1-i]-'0';
			a[alen-1-i]=t;
		}
	}
	if(blen%2)
	{
		for(int i=0;i<=blen/2;i++) 
		{
			int t=b[i]-'0';
			b[i]=b[blen-1-i]-'0';
			b[blen-1-i]=t;
		}

	}
	else
	{
		for(int i=0;i<blen/2;i++) 
		{
			int t=b[i]-'0';
			b[i]=b[blen-1-i]-'0';
			b[blen-1-i]=t;
		}
	}
	int sum = 0;
	int s[200]={0};
	memset(s,0,sizeof(s));
	int k=0;
	for(int i=0;i<blen;i++)//这里操作了各位相乘 并把结果保留在了s中
	{
		k=i;
		for(int j=0;j<alen;j++)
		{
			sum=b[i]*a[j]+s[k]+sum;
			s[k++]=sum%10;
			sum=sum/10;
		}
		if(sum)
			s[k++]=sum;
	}
	for(int i=k-1;i>=0;i--)
	{
		cout<<s[i];
	}
	cout<<endl;
}

int main()
{
	char a[50],b[50];
	while(1)
	{
		cin>>a>>b;
		char c[100];
		mult(a,b);
	}
	system("pause");
	return 0;
}

代码很长主要是中间处理两个数组的时候我费了很多劲,这里完全可以不用这么做,重新开辟一个数组很方便的。代码很短。主要看中间想成的那部分代码。

下面我贴上模板中的代码,我没有看懂,因为我看到代码处理时用到了二维数组,我觉得二维数组局限性就大了,比如位数不能太多等等。所以我就没仔细研究。

看以看看模板中怎么处理的数组,把我的那部分替换掉。

#include<iostream>
#include<string.h>
using namespace std;

void mult(char a[],char b[],char s[])
{
	int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
	char result[65];
	alen=strlen(a);blen=strlen(b);
	for(i=0;i<alen;i++)
		for(j=0;j<blen;j++)
			res[i][j]=(a[i]-'0')*(b[j]-'0');
	for(i=alen-1;i>=0;i--)
	{
		for(j=blen-1;j>=0;j--)
		{
			sum=sum+res[i+blen-j-1][j];
			cout<<i+blen-j-1<<"  "<<res[i+blen-j-1][j]<<endl;
		}
		result[k]=sum%10;
		k=k+1;
		sum=sum/10;
	}
	for(i=blen-2;i>=0;i--)
	{
		for(j=0;j<=i;j++)
			sum=sum+res[i-j][j];
		result[k]=sum%10;
		k=k+1;
		sum=sum/10;
	}
	if(sum!=0){result[k]=sum;k=k+1;}
	for(i=0;i<k;i++)
		result[i]+='0';
	for(i=k-1;i>=0;i--)
		s[i]=result[k-1-i];
	s[k]='\0';
	while(1)
	{
		if(strlen(s)!=strlen(a)&&s[0]=='0')
			strcpy(s,s+1);
		else
			break;
	}
}

int main()
{
	char a[50],b[50];
	cin>>a>>b;
	char c[100];
	mult(a,b,c);
	cout<<c<<endl;
	cout<<endl;
	cout<<endl;
	system("pause");
	return 0;
}

好了!

感谢自己坚持。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值