Advertisement
karbaev

Euclid_bin

Oct 10th, 2015
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.65 KB | None | 0 0
  1.  
  2. //Указание: НОД(a,b)=2НОД(a/2,b/2),если a и b – четные, НОД(a,b)=НОД(a/2,b), если а -
  3. //четное, b – нечетное, НОД(a,b)=НОД(a-b,b),если a и b – нечетные
  4. int binary_gcd(int u, int v)
  5. {
  6.   int shl = 0;
  7.  
  8.   while ( u && v && u!=v ) {
  9.     bool eu = !(u & 1);
  10.     bool ev = !(v & 1);
  11.  
  12.     if ( eu && ev ) {
  13.       ++shl;
  14.       u >>= 1;
  15.       v >>= 1;
  16.     }
  17.     else if ( eu && !ev ) u >>= 1;
  18.     else if ( !eu && ev ) v >>= 1;
  19.     else if ( u>=v ) u = (u-v)>>1;
  20.     else {
  21.       int tmp = u;
  22.       u = (v-u)>>1;
  23.       v = tmp;
  24.     }
  25.   }
  26.  
  27.   return !u? v<<shl : u<<shl;
  28. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement