1、計(jì)算兩個(gè)大數(shù)相乘的結(jié)果楚午。
2、算法流程:
(1)大數(shù)可能超出任何一種整數(shù)類型尿招,會(huì)引發(fā)溢出問(wèn)題矾柜,所以用字符串的格式存儲(chǔ)數(shù)a,b;
(2)計(jì)算字符串a(chǎn)的的長(zhǎng)度aLen即位數(shù),計(jì)算字符串b的長(zhǎng)度bLen.
(3)兩個(gè)數(shù)相乘最大為aLen+bLen,整形sumLen=aLen+bLen;
(4)聲明字符數(shù)組maxArr用于保存a,b中的更大者泊业,聲明整形maxLen保存a,b長(zhǎng)度的更大者把沼。聲明字符數(shù)組minArr用于保存a,b中的更小者啊易,聲明整形minLen保存a,b長(zhǎng)度的更小者吁伺。如下所示:
(5)創(chuàng)建整形數(shù)組sumArr用于保存相乘后的結(jié)果,創(chuàng)建整形數(shù)組tmpArr保存數(shù)a的某一位與數(shù)b各位相乘的結(jié)果租谈,如下所示:
(6)更小的數(shù)minArr的各位(個(gè)位篮奄,十位,百位割去,千位等)依次和更大數(shù)minArr的各位相乘并存儲(chǔ)在臨時(shí)數(shù)組tmpArr中
3窟却、具體代碼:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char* a="9999999";
char* b="9999999";
int aLen=strlen(a);
int bLen=strlen(b);
int sumLen=aLen+bLen;
cout << "aLen="<<aLen<<" bLen="<<bLen<<<< "sumLen="<<sumLen<<endl;
int minLen=0,maxLen=0;
char* maxArr,minArr;
if(aLen>bLen){
maxArr=a;
minArr=b;
maxLen=aLen;
minLen=bLen;
}else{
maxArr=b;
minArr=a;
maxLen=bLen;
minLen=aLen;
}
int* sumArr=new int[sumLen];
int* tmpArr=new int[sumLen];
for(int i=0;i<sumLen;i++){
sumArr[i]=0;
tmpArr[i]=0;
}
int mulJin=0,addJin=0;
for(int i=minLen-1;i>=0;i--){
int k=--sumLen;
for(int j=maxLen-1;j>=0;j--){
tmpArr[k]=((maxArr[j]-'0')*(minArr[i]-'0')+mulJin)%10;
mulJin=((maxArr[j]-'0')*(minArr[i]-'0')+mulJin)/10;
k--;
}
if(mulJin>0){
tmpArr[k]=mulJin;
}
mulJin=0;
for(int i=aLen+bLen-1;i>=0;i--){
int tmp=(sumArr[i]+tmpArr[i]+addJin);
sumArr[i]=tmp%10;
addJin=tmp/10;
}
addJin=0;
for(int i=0;i<aLen+bLen;i++){
tmpArr[i]=0;
}
}
int t=0;
while(true){
if(sumArr[t]==0){
t++;
}else{
break;
}
}
for(;t<aLen+bLen;t++){
cout << sumArr[t];
}
return 0;}