Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- int number_of_digits(long long int number);// count number of digits
- int separ_l(long long int num);
- int separ_r(long long int num);
- long long int karatsuba_method(long long int num1, long long int num2);
- int main() {
- long long int num1, num2;
- cin >> num1 >> num2;
- //cout << karatsuba_method(num1, num2);
- //cout << separ_l(num1) << " " << separ_r(num1) << endl;
- //cout << separ_l(num2) << " " << separ_r(num2) << endl;
- //cout << number_of_digits(num1) << " " << number_of_digits(num2) << endl;
- cout << karatsuba_method(num1, num2);
- cout << endl;
- system("pause");
- return 0;
- }
- int number_of_digits(long long int number) {
- int amount = 0;
- if (number > 1) amount = amount + number_of_digits(number / 10);
- amount++;
- return amount;
- }
- long long int karatsuba_method(long long int num1, long long int num2) {
- long long int ANS;
- //num1_l = separ_l(num1);
- //num1_r = separ_r(num1);
- //num2_l = separ_l(num2);
- //num2_r = separ_r(num2);
- if (number_of_digits(separ_l(num1)) > 2)//
- ANS = (int)pow(10, number_of_digits(num1)) * karatsuba_method(separ_l(num1), separ_l(num2))
- + (int)pow(10, number_of_digits(num1) / 2)*
- (karatsuba_method((separ_l(num1) + separ_r(num1)), (separ_l(num2) + separ_r(num2))) -
- karatsuba_method(separ_l(num1), separ_l(num2)) -
- karatsuba_method(separ_r(num1), separ_r(num2))) +
- karatsuba_method(separ_r(num1), separ_r(num2));
- else
- ANS = (int)pow(10, number_of_digits(num1)) * separ_l(num1)*separ_l(num2) +
- (int)pow(10, number_of_digits(num1) / 2)*
- ((separ_l(num1) + separ_r(num1)) * (separ_l(num2) + separ_r(num2)) -
- separ_l(num1)*separ_l(num2) - separ_r(num1)*separ_r(num2)) + separ_r(num1)*separ_r(num2);
- return ANS;
- }
- int separ_l(long long int num) {// separates left part of number (lp is greater than half)
- return num / (long long int)(powl(10, number_of_digits(num) / 2));
- }
- int separ_r(long long int num) {// separates right part of number (rp is less than half)
- return num % (long long int)(pow(10, number_of_digits(num) / 2));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement