大整数乘法 算法:
#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