1. 程式人生 > >大數相加相乘

大數相加相乘

用乘法行列式多次相乘多次相加,時間複雜度為O(nm),n,m分別為兩個數字長度。

#include<stdio.h>
#include<iostream>
#include<string>
#include<sstream>
using namespace std;

string a,b,ans,zero,product;///輸入a,b,ans是最終答案,zero是乘法行列式補零用的,product暫時儲存單位數乘積
int len1,len2,cha,maxx;
int s,r;///s是本位,r是進位

string add(string a,string
b)///字串大數相加 { string res=""; s=0;r=0; len1=a.size(); len2=b.size(); if(len1>=len2) { cha=len1-len2; for(int i=0;i<cha;i++) b="0"+b; } else { cha=len2-len1; for(int i=0;i<cha;i++) a="0"+a; } maxx=max(len1,len2);
for(int i=maxx-1;i>=0;i--) { s=(a[i]-'0'+b[i]-'0'+r)%10;///先加上上次的進位 r=(a[i]-'0'+b[i]-'0'+r)/10;///本次進不進位,進位則是1,不進位則是0 res=(char)(s+'0')+res; } if(r) res="1"+res; ///最左邊需不需要進位 return res; } string trans(int a) ///整型轉化為string型,需要標頭檔案sstream { stringstream ss;///中轉站 string
res; ss<<a; ss>>res; return res; } string multiplication(string a,char b)///字串數字*單個字元 { s=r=0; string res=""; int x,y=b-'0'; int len=a.size(); for(int i=len-1;i>=0;i--) { x=a[i]-'0'; s=(x*y+r)%10; r=(x*y+r)/10; res=(char)(s+'0')+res; } if(r) res=char(r+'0')+res; return res; } int main() { int t; cin>>t; for(int i=1;i<=t;i++) { cin>>a>>b; ans=""; zero=""; len2=b.size(); for(int j=len2-1;j>=0;j--) { product=multiplication(a,b[j])+zero; ans=add(ans,product); zero=zero+'0'; ///每往左進一位,乘法多補一個0 } cout<<ans<<endl; } return 0; }