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

大整数乘法 算法:
#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
    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/kevinelstri/article/details/49822261
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞