-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathassignment1.cpp
31 lines (28 loc) · 977 Bytes
/
assignment1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;
unsigned long long Karatsuba(unsigned long long a, unsigned long long b) {
unsigned long long digits;
unsigned long long lefta, righta, leftb, rightb;
unsigned long long x1, x2, x3;
if (a < 10 || b < 10) {
return a*b;
}
string astr = to_string(a);
string bstr = to_string(b);
digits = max(astr.length(), bstr.length());
unsigned long long half = digits/2;
lefta = stoi(astr.substr(0, half));
righta = stoi(astr.substr(half, digits-half));
leftb = stoi(bstr.substr(0, half));
rightb = stoi(bstr.substr(half, digits-half));
x1 = Karatsuba(lefta, leftb);
//cout << "ac is " << x1 << endl;
x2 = Karatsuba(righta, rightb);
//cout << "bd is " << x2 << endl;
x3 = Karatsuba((lefta+righta), (leftb+rightb));
return x1 * pow(10, 2*half) + (x3-x2-x1) * pow(10, half) + x2;
}
int main()
{
cout << Karatsuba(1234, 1234);
}