本文适用于高精度之间的相乘,当然,如果不是高精度乘以高精度也是可以的,不过大材小用罢了。
第一步:设两个char 数组,并计算他们的长度(高精度*高精度不用再求两者长度的最大值了,但两者的长度后面会有别的用处)
第二步:设两个int 数组,并将两个char 数组进行转换
第三步:设一个int 数组,进行乘法运算,(一位一位相乘,先不用考虑之间的进位)
第四步;用两个char 数组的长度求出两个数相乘的最小长度(当然,前提是两者任意一个都不为零)。
第五步:对最高位进行判断,如果最高位大于零,则长度加一,如果最高位大于等于十的话,在进行进一步的判断。
第六步:避免最高位是零的情况(如与零相乘时)。
第七步:倒序输出即可。
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
int main ()
{
char a[100000]; // 第一步
char b[100000];
cin >> a >> b ;
int len1=strlen(a);
int len2=strlen(b);
int aa[100000]; //第二步
int bb[100000];
for (int i=0;i<len1;i++) aa[i]=a[len1-1-i]-'0';
for (int i=0;i<len2;i++) bb[i]=b[len2-1-i]-'0';
int c[100000]; //第三步
for(int i=0;i<len1;i++)
{
for (int j=0;j<len2;j++)
{
c[i+j]=c[i+j]+aa[i]*bb[j];
}
}
int len=len1+len2-1; // 第四步
for (int i=0;i<len;i++)
{
c[i+1] = c[i+1] + c[i]/10;
c[i]%=10;
}
if(c[len]>0)len++; //第五步
while (c[len-1]>=10)
{
c[len]=c[len-1]/10;
c[len-1] %=10;
len++;
}
while (c[len-1]==0 && len>1) //第六步
{
len--;
}
for (int i=len-1;i>=0;i--) //第七步
{
cout << c[i];
}
cout << endl;
return 0;
}


京公网安备 11010502036488号