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

来源:互联网 发布:怎么在淘宝上刷销量 编辑:程序博客网 时间:2024/05/16 04:51
大整数乘法 算法:#include<iostream>#include<stdio.h>using namespace std;#define MAX 100void 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

0 0
原创粉丝点击