您的位置:首页 > 其它

【高精度计算 02】 大整数乘法

2015-11-13 19:36 453 查看
大整数乘法 算法:
#include<iostream>
#include<stdio.h>
using namespace std;

#define MAX 100

void GetNum(char *s){
scanf("%s",s);
}

//字符串转换成整形数组
void convert(char *s1,int *a){
int len1=strlen(s1);
for(int i=0;i<=len1;i++){
a[len1-1-i]=s1[i]-'0';  //逆序输出数组
}
}

//交叉乘积,进行累加
void multiNum(char *s1,char *s2,int *a,int *b,int *c){
int len1=strlen(s1);
int len2=strlen(s2);
for(int i=0;i<=len1;i++){
for(int j=0;j<=len2;j++){
c[i+j]+=a[i]*b[j];
}
}
}

void result(char *s1,char *s2,int *c){
int len1=strlen(s1);
int len2=strlen(s2);
int len=len1+len2;

//处理进位的问题
for(int i=0;i<len;i++){
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}

//输出结果
int j=len;
while(c[i]==0&&i>0)
i--;
if(i<0)
printf("0");
else{
while(i>=0)
printf("%d",c[i--]);
}
printf("\n");
}

void main(){
char s1[MAX],s2[MAX];
int  c[MAX*2],a[MAX],b[MAX];

GetNum(s1);
GetNum(s2);      //输入两个字符串
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
convert(s1,a);
convert(s2,b); //将字符数组转化为整形数组
multiNum(s1,s2,a,b,c); //求积
result(s1,s2,c);         //输出最后的结果
}


算法思想:

———————————————————————————-

两个大数相乘,就是使用每一位与另外一个进行相乘,然后使用交叉相加,

最后数组的每一位仅保留末尾一位,逐步累加,最后输出数组。

8   7   6   5   *
16  14  12  10  2
24  21  18  15  3
32  28  24  20  4


16  14  12  10
24  21  18  15
32  28  24  20
16  38  65  56  39  20


16       38       65       56       39      20
2  16+4=20  38+7=45  65+6=71  56+4=60  39+2=41
留2  留0进2   留5进4   留1进7   留0进6   留1进4  留0进2
2  0        5        1        0        1       0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  高精度 乘法 大整数