高精度乘法哦吼吼
阿新 • • 發佈:2019-03-03
end lib algo iostream () sin scan 字符 esp
廢話不多說,直接上代碼
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<iomanip> using namespace std; int main() { char a1[2001],b1[2001];//用來存放輸入的數 int a[2001]={},b[2001]={},c[200001]={},lena,lenb,lenc,i,j,x; scanf("%s",a1); scanf("%s",b1);//輸入兩個數a,b,用字符的形式存儲 lena=strlen(a1);lenb=strlen(b1);//存放a和b的長度; for(i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48;//將char類型轉化為int類型存儲 for(i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;//(從後往前方便進位) for(i=1;i<=lena;i++) { x=0;//x用來存儲進位,每次循環要清零 for(j=1;j<=lenb;j++) { c[i+j-1]=a[i]*b[i]+x+c[i+j-1]; x=c[i+j-1]/10;//進位 c[i+j-1]%=10;//實際數(不一定是最終的) } c[i+lenb]=x;//當j循環完畢時,將進位傳遞到下一個i } lenc=lena+lenb; while(c[lenc]==0&&lenc>1) lenc--; for(i=lenc;i>=1;i--)//註意前面是倒序輸入的,這裏也要倒序輸出; cout<<c[i]; cout<<endl; //結束嘍 }
註意核心算法
for(i=1;i<=lena;i++) { x=0;//x用來存儲進位,每次循環要清零 for(j=1;j<=lenb;j++) { c[i+j-1]=a[i]*b[i]+x+c[i+j-1]; x=c[i+j-1]/10;//進位 c[i+j-1]%=10;//實際數(不一定是最終的) } c[i+lenb]=x;//當j循環完畢時,將進位傳遞到下一個i }
原理:
a2 a1
X b2 b1
_________________________________________
a1*b1
a1*b2
a2*b1
a2*b2
__________________________________________
按位相加
高精度乘法哦吼吼