Advertisement
Guest User

karatsuba_me

a guest
Oct 26th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int number_of_digits(long long int number);// count number of digits
  5. int separ_l(long long int num);
  6. int separ_r(long long int num);
  7. long long int karatsuba_method(long long int num1, long long int num2);
  8. int main() {
  9.     long long int num1, num2;
  10.     cin >> num1 >> num2;
  11.     //cout << karatsuba_method(num1, num2);
  12.     //cout << separ_l(num1) << " " << separ_r(num1) << endl;
  13.     //cout << separ_l(num2) << " " << separ_r(num2) << endl;
  14.     //cout << number_of_digits(num1) << " " << number_of_digits(num2) << endl;
  15.     cout << karatsuba_method(num1, num2);
  16.     cout << endl;
  17.     system("pause");
  18.     return 0;
  19. }
  20. int number_of_digits(long long int number) {
  21.     int amount = 0;
  22.     if (number > 1) amount = amount + number_of_digits(number / 10);
  23.     amount++;
  24.         return amount;
  25. }
  26. long long int karatsuba_method(long long int num1, long long int num2) {
  27.     long long int  ANS;
  28.     //num1_l = separ_l(num1);
  29.     //num1_r = separ_r(num1);
  30.     //num2_l = separ_l(num2);
  31.     //num2_r = separ_r(num2);
  32.  
  33.     if (number_of_digits(separ_l(num1)) > 2)//
  34.         ANS = (int)pow(10, number_of_digits(num1)) * karatsuba_method(separ_l(num1), separ_l(num2))
  35.         + (int)pow(10, number_of_digits(num1) / 2)*
  36.         (karatsuba_method((separ_l(num1) + separ_r(num1)), (separ_l(num2) + separ_r(num2))) -
  37.             karatsuba_method(separ_l(num1), separ_l(num2)) -
  38.             karatsuba_method(separ_r(num1), separ_r(num2))) +
  39.         karatsuba_method(separ_r(num1), separ_r(num2));
  40.     else
  41.         ANS = (int)pow(10, number_of_digits(num1)) * separ_l(num1)*separ_l(num2) +
  42.         (int)pow(10, number_of_digits(num1) / 2)*
  43.         ((separ_l(num1) + separ_r(num1)) * (separ_l(num2) + separ_r(num2)) -
  44.             separ_l(num1)*separ_l(num2) - separ_r(num1)*separ_r(num2)) + separ_r(num1)*separ_r(num2);
  45.     return ANS;
  46. }
  47. int separ_l(long long int num) {// separates left part of number (lp is greater than half)
  48.     return num / (long long int)(powl(10, number_of_digits(num) / 2));
  49. }
  50. int separ_r(long long int num) {// separates right part of number (rp is less than half)
  51.    
  52.     return num % (long long int)(pow(10, number_of_digits(num) / 2));
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement