密码学大数乘法

        大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。

一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。

 三 大数乘法。

大数乘法,相对之前的加法和减法,难度有所提高,但是本质还是一样的。

下面说说我的方法:

1、利用字符数组读入大数a,b

2、将大数反向存储到整型数组中。(此时满足低位在数组下标小的位置上)

3、逐个相乘。   此时要注意 乘数i位和乘数j位的乘积,应累加在结果数组的i+j位上。  这个结论不难发现,可通过列个简单的竖式乘法验证。

4.、处理进位,(从低位开始到最高位逐位处理,将本位结果的个位作为该为的结果,而10位以上的数均作为进位进到上一位,一直到所有进位处理完)

5、然后整体再反向存入字符数组,打印出结果。

代码如下

#include<iostream>
#include<assert.h>
using namespace std;
void muti(char *a,char *b,int *c)
{
	assert(a&&b&&c);
	int len1=strlen(a);
	int len2=strlen(b);
	int len3=len1+len2;
	for(int i=0;i<len1;i++)
	{
		for(int j=0;j<len2;j++)
		{
			c[i+j+1]=c[i+j+1]+(a[i]-'0')*(b[j]-'0');
		}
	}
	for(int i=len1+len2;i>0;--i)
	{
		if(c[i]>=10)
		{
			c[i-1]=c[i-1]+c[i]/10;
			c[i]=c[i]%10;
		}
	}
	for(int i=0;i<len1+len2;i++)
	{
		cout<<c[i];
	}

}
int main()
{
	char arr[]="2222222222222";
	char brr[]="2222222222222";
	int str[100]={0};
	muti(arr,brr,str);
	system("pause");
	return 0;
}
/*
	    856
*	    856
-----------------
      48,30,36   c[i+j+1]=c[i+j+1]+(a[i]-'0')*(b[j]-'0');
   40,25,30
64,40,48		c[i-1]=c[i-1]+c[i]/10;
			    c[i]=c[i]%10;
---------------
73  2  7  3  6
	   
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值