Advertisement
Guest User

karatsuba

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