問題描述
求兩個不超過200位的非負整數的積。
輸入形式
有兩行,每行是乙個不超過200位的非負整數,沒有多餘的前導0。
輸出形式
一行,即相乘後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。
樣例輸入
樣例輸出
思路:設兩個整數x和y相乘,先看x,y位數一致時的情況,
將四次乘法變成了三次乘法,時間複雜度為t(n)=3t(n/2)+o(n) (n > 1),根據master定理
。當x,y位數不一致時,就為位數小的那方補零使其對齊。
在兩數字數差距較大時還可以繼續優化。
#include#includeview code#include
#include
using
namespace
std;
bool compare(string a, string b, int alen, int
blen)
void fun(string &a, string &b, string &c, string &d)
string subtract(string a, string
b)
string
result;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
//cout << a << ' ' << b << endl;
for (int i = 0; i < blen; i++)
a[j] -= 1
; }
else res = (a[i] - '
0') - (b[i] - '0'
); result += res + '0'
;
}result += a.substr(blen, alen - 1
);
if (!judge) result += '-'
; reverse(result.begin(), result.end());
return
result;
}string add(string a, string
b)
if (a[0] != '
-' && b[0] == '-'
)
if (a[0] == '
-' && b[0] == '-'
)
int alen =a.length();
int blen =b.length();
if (alen
string s(alen-blen, '0'
); b = s +b;
//cout << a << ' ' << b << endl;
int flag = 0
;
string
result;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (int i = 0; i < alen; i++)
if (flag == 1) result += '1'
;
//result += a.substr(blen, alen - 1);
if (adv == -1) result += '-'
; reverse(result.begin(), result.end());
return
result;
}string multiply(string a, string
b)
if(b[0] == '-'
)
int alen =a.length();
int blen =b.length();
if (a[0] == '
0' || b[0] == '
0') return"0
";if (alen
string
result;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int res = 0
;
for (int i = 0; i < blen; i++)
if (adv > 0) parameter += '
0' +adv;
reverse(parameter.begin(), parameter.end());
//cout << parameter << endl;
string s(i, '0'
);
if (i == 0) result =parameter;
else result = add(result, parameter+s);
//cout << result << endl;
}
if (flag == -1) return"-
"+result;
return
result; }//
10^n ac+10^(n/2)+bd
//ac bd (a-b)(d-c)
string solve(string a, string
b)
if(b[0] == '-'
)
int alen =a.length();
int blen =b.length();
if (a[alen-1] =='
0' && a[0] == '
0' || b[blen-1] == '
0' && b[0] == '
0') return"0
";if (alen
string s(alen - blen, '0'
); b = s +b;
int n =alen;
if(n == 1
)
int mid = n / 2
;
string
a, b, c, d, ac, bd, x;
a = a.substr(0
, mid);
b = a.substr(mid, n-mid);
c = b.substr(0
, mid);
d = b.substr(mid, n-mid);
fun(a, b, c, d);
ac =solve(a, c);
bd =solve(b, d);
x =solve(subtract(a, b), subtract(d, c));
//cout << a << ' ' << b << ' ' << c << ' ' << d << endl;
//cout << ac << ' ' << bd << ' ' << x << endl;
int x =n;
int y = n / 2
;
if (n % 2
)
string s1(x, '0'
);
string s2(y, '0'
);
string
result;
if(flag==-1) result += '-'
; result += add(add(ac+s1, bd), add(x, add(ac, bd))+s2);
//cout << add(ac+s1, bd) << ' ' << add(ac, bd) << ' ' << add(x, add(ac, bd)) <
return
result;
}int
main()
大整數乘法
參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...
大整數乘法
問題描述 by 計算機演算法設計與分析 王曉東 p17 通常,在分析乙個演算法的計算複雜性時,都將加法和乘法運算當作是基本運算來處理,即將執行一次加法或乘法運算所需的計算時間當作乙個僅取決於計算機硬體處理速度的常數。這個假定僅在計算機硬體能對參加運算的整數直接表示和處理時才是合理的。然而,在某些情況...
大整數乘法。
include using namespace std int multi int num1,int size1,int num2,int size2 int size size1 size2 int ret new int size int i 0 for i 0 iret i 0 for i 0...