最大公约数与最小公倍数问题

最大公约数与最小公倍数问题


最大公约数


uint64_t gcd(uint64_t x, uint64_t y)
{
    uint64_t ret = 1;
    if (x == y) {
        return y;
    }
    while (true) {
        if (x < y) {
            uint64_t t = x;
            x = y;
            y = t;
        }

        if (0 == y) {
            return x * ret;
        }

        if (0 == x & 0x01) {
            if (0 == y & 0x01) {
                ret <<= 1;
                x >>= 1;
                y >>= 1;
            } else {
                x >>= 1;
            }
        } else {
            if (0 == y & 0x01) {
                y >>= 1;
            } else {
                x -= y;
            }
        }	
    }
}


最小公倍数


uint64_t lcm(uint64_t x, uint64_t y)
{
	if (0 == x || 0 == y) {
		return 0;
	} else {
		return x / gcd(x, y) * y;
	}
}

posted @ 2015-08-04 11:01  WONDERFUL_cnblogs  阅读(152)  评论(0编辑  收藏  举报