#include <iostream>
#include <exception>
#include <stdexcept>
int gcd(int a, int b) {
if(a<0 || b<0) {
throw std::invalid_argument("a and b must be negative values");
}
if(a==0 || b==0)
return a+b;
while(a!=b) {
if(a>b) {
a = a - b;
}
else {
b = b - a;
}
}
return a;
}
#define expect_true(arg) \
do { \
if(!(arg)) { \
std::cout << "Unexpected false at " \
<< __FILE__ << ", " << __LINE__ << ", " << __func__ << ": " << #arg \
<< std::endl; } \
} while(false);
void test_gcd() {
expect_true(gcd(16,24) == 8);
expect_true(gcd(0, 19) == 19);
bool exceptionCaught = false;
try {
gcd(5, -15);
} catch (const std::invalid_argument& ex) {
std::cout << "Illegal as expected" << std::endl;
exceptionCaught = true;
}
expect_true(exceptionCaught);
}
int main() {
test_gcd();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZXhjZXB0aW9uPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKaW50IGdjZChpbnQgYSwgaW50IGIpIHsKICAgIGlmKGE8MCB8fCBiPDApIHsKICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoImEgYW5kIGIgbXVzdCBiZSBuZWdhdGl2ZSB2YWx1ZXMiKTsKICAgIH0KCWlmKGE9PTAgfHwgYj09MCkKCSAgICByZXR1cm4gYStiOwoJd2hpbGUoYSE9YikgewoJICAgIGlmKGE+YikgewoJICAgICAgICBhID0gYSAtIGI7CgkgICAgfQoJICAgIGVsc2UgewoJICAgICAgICBiID0gYiAtIGE7CgkgICAgfQoJfQoJcmV0dXJuIGE7Cn0KCiNkZWZpbmUgZXhwZWN0X3RydWUoYXJnKSBcCiAgICAgICAgZG8geyBcCiAgICAgICAgICAgIGlmKCEoYXJnKSkgeyBcCiAgICAgICAgICAgIAlzdGQ6OmNvdXQgPDwgIlVuZXhwZWN0ZWQgZmFsc2UgYXQgIiBcCiAgICAgICAgICAgIAkgICAgICAgICAgPDwgX19GSUxFX18gPDwgIiwgIiA8PCBfX0xJTkVfXyA8PCAiLCAiIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgI2FyZyBcCiAgICAgICAgICAgIAkgICAgICAgICAgPDwgc3RkOjplbmRsOyB9IFwKICAgICAgICB9IHdoaWxlKGZhbHNlKTsKCnZvaWQgdGVzdF9nY2QoKSB7CiAgICBleHBlY3RfdHJ1ZShnY2QoMTYsMjQpID09IDgpOwogICAgZXhwZWN0X3RydWUoZ2NkKDAsIDE5KSA9PSAxOSk7CiAgICBib29sIGV4Y2VwdGlvbkNhdWdodCA9IGZhbHNlOwogICAgdHJ5IHsKICAgICAgICBnY2QoNSwgLTE1KTsKICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6aW52YWxpZF9hcmd1bWVudCYgZXgpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIklsbGVnYWwgYXMgZXhwZWN0ZWQiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBleGNlcHRpb25DYXVnaHQgPSB0cnVlOwogICAgfQogICAgZXhwZWN0X3RydWUoZXhjZXB0aW9uQ2F1Z2h0KTsKfQoKaW50IG1haW4oKSB7Cgl0ZXN0X2djZCgpOwoJcmV0dXJuIDA7Cn0=