高精度乘法
为什么需要高精度乘法
原因:
首先我们看一看C语言用到的表示整数的数据类型
1.int
2.long int
3.long long int
即使是最大的long long int 类型能表达的位数依然有限(可以去百度具体就不写了)
所以需要一个处理更大数据的策略
如何改进处理大数据的乘法
既然我们的计算机无法处理这么大的数字,那么我们可以试着转换一下思想,做一个模拟乘法,他不一定是计算机在完成乘法而是给出一个算法,计算机程序执行完以后结果就是乘法得出的结果。而同时计算机不用处理这么大的数据。最容易想到的是把数字当作字符处理。下main给出了两种方法
两种思路
a.
示意图:
代码:
#include <stdio.h>
#include <string.h>
int main()
{
int a[1000],b[1000],c[1000];//准备好三个数组
int lena,lenb,lenc,i,j;
char s1[]="986";
char s2[]="123";
lena=strlen(s1);
lenb=strlen(s2);
for(i=0;i<1000;i++)//将c数组赋予初值,后面会用上
c[i]=0;
for(i=1;i<=lena;i++)//986存入a[]
a[i]=s1[lena-i]-'0';
for(i=1;i<=lenb;i++)//123存入b[]
b[i]=s2[lenb-i]-'0';
for(i=1;i<=lenb;i++)//遍历被乘数123
for(j=1;j<=lena;j++)//遍历乘数986
c[i+j-1]+=a[j]*b[i];//c数组的
lenc=lena+lenb-1;
for(i=1;i<=lenc;i++)
{
c[i+1]+=c[i]/10;//求进位并把进位加入高位
c[i]%=10;//保存余数
}
lenc++;//将数组长度加1用来保留前面产生的进位
while(c[lenc]==0&&lenc>1)
lenc--;//删去前面多余的0
for(i=lenc;i>=1;i--)//遍历输出
printf("%d",c[i]);
printf("\n");
return 0;
}
流程:
b.
示意图;
代码:
(与上一个代码基本一样除了标注部分)
#include <stdio.h>
#include <string.h>
int main()
{
int a[1000],b[1000],c[1000];
int lena,lenb,lenc,i,j;
char s1[]="986";
char s2[]="123";
lena=strlen(s1);
lenb=strlen(s2);
for(i=0;i<1000;i++)
c[i]=0;
for(i=1;i<=lena;i++)
a[i]=s1[lena-i]-'0';
for(i=1;i<=lenb;i++)
b[i]=s2[lenb-i]-'0';
//************************************************
(和上一个代码不一样部分)
for(i=1;i<=lenb;i++)
for(j=1;j<=lena;j++)
{
c[i+j-1]+=a[j]*b[i];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
lenc=lena+lenb;
//************************************************
for(i=1;i<=lenc;i++)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
lenc++;
while(c[lenc]==0&&lenc>1)
lenc--;
for(i=lenc;i>=1;i--)
printf("%d",c[i]);
printf("\n");
return 0;
}
流程图: