Pagini recente » Cod sursa (job #1630067) | Cod sursa (job #1108534) | Cod sursa (job #2481305) | Cod sursa (job #1798837) | Cod sursa (job #878068)
Cod sursa(job #878068)
#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);
}