#include#include#include#include#includeusing namespace std;
class bigdecimal
bigdecimal(string n)
bigdecimal operator + (bigdecimal b)
else
//開始進行加法運算
while(j>=0)
else
i--;
j--;
} //如果l遍歷完後,進製仍然為1,就要消耗進製直到它為0
while(i>=0 && temp==1)
else
} //如果到達最高位後還有進製,則該數最前面加個'1'
if(temp)
return bigdecimal(s);
} bigdecimal operator - (bigdecimal b)
else
i--;
j--;
} //減完後如果借位仍然為1,消耗借位直到為0
while(i>=0 && temp)
else
} i=0;
//如果數字開頭為0,就除去
while(s.length() > 1)
else
} return bigdecimal(s);
} bigdecimal mul(string a,string b)
bigdecimal mul(string a,int n)
char *k=new char[n+1];
memset(k,'0',n*sizeof(char));
k[n]='\0';
string temp;
deletek;
return bigdecimal(a);
} void sub(int center,bigdecimal *s1,bigdecimal *s0)
else
} bigdecimal operator * (bigdecimal b)
bigdecimal temp , a1 , a0 , b1 , b0 , c2 , c1 , c0;
int maxbit=max(n.length() , b.n.length());
sub(maxbit/2 , &a1 , &a0);
b.sub(maxbit/2 , &b1 , &b0);
c2 = a1 * b1;
c0 = a0 * b0;
c1 = (a1 + a0) * (b1 + b0) - (c2 + c0);
return mul(c2.n , maxbit/2*2) + mul(c1.n , maxbit/2) + c0;
}};int main()
bigdecimal temp , a1 , a0 , b1 , b0 , c2 , c1 , c0;
int maxbit=max(n.length() , b.n.length());
sub(maxbit/2 , &a1 , &a0);
b.sub(maxbit/2 , &b1 , &b0);
c2 = a1 * b1;
c0 = a0 * b0;
c1 = (a1 + a0) * (b1 + b0) - (c2 + c0);
return mul(c2.n , maxbit/2*2) + mul(c1.n , maxbit/2) + c0;}
中修改
if(n.length()<=4 && b.n.length()<=4)
中的4為600,然後改mul(n,b.n)為你的原始乘法函式mul(string,string)
大整數演算法講解與分析ppt:
演算法設計與分析 大整數乘法
宣告 本文僅個人筆記 這裡面的o n 2 就是下面的我自己畫的小學乘法計算複雜度示意圖 這裡有個問題就是4次n 2乘法怎麼變成n log4的,等想好再來接著編輯吧 注意這裡的 是十進位製大整數進行相乘,而課本給出的是二進位制機器數進行相乘 xy a10 n 2 b c10 n 2 d ac10 n ...
演算法 大整數乘法
問題描述 求兩個不超過200位的非負整數的積。輸入形式 有兩行,每行是乙個不超過200位的非負整數,沒有多餘的前導0。輸出形式 一行,即相乘後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。樣例輸入 1234567890 9876543210 樣例輸出 1219326...
分治演算法 大整數乘法
用分治演算法程式設計實現兩個n 位十進位製大整數的乘法運算。分析 用分治演算法程式設計實現兩個n 位十進位製大整數的乘法運算。演算法描述 兩個十進位制的數 x y x a 10 n1 b y c 10 n2 d 則 x y a 10 n1 b c 10 n2 d 設乙個陣列,將其看做10000 進製...