思路
1.先处理字符的符号位
2.将字符处理后压入整数数组中(倒序压入,方便后面的处理)
3.用模拟乘法的出积储存在另一个数组中
倒序的目的是为了对其相乘的时候的第一位,每一次相乘得到的数处理进位后得到的数字才是应该存储的数字,此过程与我们做乘法运算相似,可以看下面代码的注释
4.处理前置0后,处理前置0用最不利原则,然后输出,注意正数负数或者负数正数为负数,先输出一个0
代码实现
//高精度乘法
#include<cstdio>
#include<cstring>
#define max 1000 //可以修改
char s1[max]; //第一个字符串
char s2[max]; //第二个字符串
int a[max]; //乘数
int b[max]; //第二个乘数
int c[max]; //积
int main()
{
//输入
scanf("%s%s",s1,s2);
//符号处理
bool flag_a=true;
if(s1[0]=='-')
{
flag_a=false;
strcpy(s1,&s1[1]);
}
bool flag_b=true;
if(s2[0]=='-')
{
flag_b=false;
strcpy(s2,&s2[1]);
}
//将数存入int数组
int len_a=strlen(s1);
for(int i=0;i<len_a;i++)
a[i]=s1[len_a-i-1]-'0';
int len_b=strlen(s2);
for(int i=0;i<len_b;i++)
b[i]=s2[len_b-i-1]-'0';
//模拟乘法
int jw; //进位
for(int i=0;i<len_a;i++)
{
jw=0;
for(int j=0;j<len_b;j++)
{
c[i+j]=a[i]*b[j]+jw+c[i+j]; //交叉乘,
//第一个乘数的位置分别于第二个的每一位相乘 ,乘完的结果保存在c[i+j]中
//需要加上原来c[i+j]的原因是模拟的最后的每位相乘后的相加过程
jw=c[i+j]/10; //处理进位
c[i+j]=c[i+j]%10; //转换成10以内的数字
}
c[i+len_b]=jw; //最后的一个进位,我们多算一个
}
//c处理前置0
int len_c=len_a+len_b;
for(int i=len_c-1;i>=0;i--)
if(c[i]==0&&len_c>1) //没有等于1是因为最后一位为0,即相乘后为0
len_c--;
else
break;
//输出
if(((flag_a==true&&flag_b==false)||(flag_a==false&&flag_b==true))&&c[len_c-1]!=0)
printf("-");
if(c[len_c-1]==0)
printf("0\n");
else
{
for(int i=len_c-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
return 0;
}