大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。
一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。
三 大数乘法。
大数乘法,相对之前的加法和减法,难度有所提高,但是本质还是一样的。
下面说说我的方法:
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
*/