Cod sursa(job #878068)

Utilizator toranagahVlad Badelita toranagah Data 13 februarie 2013 21:27:33
Problema Algoritmul lui Euclid Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
using namespace std;

ifstream fin("euclid2.in");
ofstream fout("euclid2.out");

unsigned int gcd(unsigned int a, unsigned int b);

int main() {
	int T;
	int a, b;
	fin >> T;
	for (int i = 1; i <= T; ++i) {
		fin >> a >> b;
		fout << gcd(a, b) << '\n';
	}
	return 0;
}

unsigned int gcd(unsigned int u, unsigned int v)
{
  // simple cases (termination)
  if (u == v)
    return u;
  if (u == 0)
    return v;
  if (v == 0)
    return u;
 
  // look for factors of 2
  if (~u & 1) // u is even
    if (v & 1) // v is odd
      return gcd(u >> 1, v);
    else // both u and v are even
      return gcd(u >> 1, v >> 1) << 1;
  if (~v & 1) // u is odd, v is even
    return gcd(u, v >> 1);
 
  // reduce larger argument
  if (u > v)
    return gcd((u - v) >> 1, v);
  return gcd((v - u) >> 1, u);
}