本文适用于高精度之间的相乘,当然,如果不是高精度乘以高精度也是可以的,不过大材小用罢了。
第一步:设两个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; }