#include <iostream>
#include <cassert>
using namespace std;
void Add(int num1, int den1, int num2, int den2, int & result_num, int & result_den);
void Sub(int num1, int den1, int num2, int den2, int& result_num, int& result_den);
void Mpy(int num1, int den1, int num2, int den2, int& result_num, int& result_den);
void Div(int num1, int den1, int num2, int den2, int result_num, int result_den);
int lcm(int m, int n);
int gcd(int n, int m);
void Reduction(int num, int den, int& result_num, int& result_den); //reduction함수의 첫번째 두번째 인자는 사칙연산의 결과의 분자/분모이다.
int main()
{
int a, b, c, d;
int resultNum, resultDen;
cout << "분자/분모를 차례대로 입력하시오(분모에 0넣으면 Error!)" << endl;
cout << "(음수인 분수는 분자에 음수를 입력해주세요 !! : ";
cin >> a >> b >> c >> d;
assert(b != 0 && d != 0);
/*모든 사칙연산 계산 함수에 자동 약분까지 되어 산출*/
Add(a, b, c, d, resultNum, resultDen); //덧셈
Sub(a, b, c, d, resultNum, resultDen); //뺄셈
Mpy(a, b, c, d, resultNum, resultDen); //곱셈
Div(a, b, c, d, resultNum, resultDen); //나눗셈
cout << endl; // 깔끔한 개행
return 0; // 종료
}
void Add(int num1, int den1, int num2, int den2, int & result_num, int & result_den)
{
int add_num, add_den;
result_den = lcm(den1, den2);
result_num = (result_den / den1)*num1 + (result_den / den2)*num2;
if (result_den < 0 && result_num>0)
{
int minus_to_plus_den = -result_den;
Reduction(result_num, minus_to_plus_den, add_num, add_den);
}
else if (result_num < 0 && result_num>0)
{
int minus_to_plus_num = -result_num;
Reduction(minus_to_plus_num, result_den, add_num, add_den);
}
else if (result_den < 0 && result_num < 0)
{
result_den = -result_den;
result_num = -result_num;
Reduction(result_num, result_den, add_num, add_den);
}
//조건 : 연산만되고 약분이안된 분수의 분자, 분모의 음수 여부를 체크한다 이유는 약분하는 함수(Reduction)에 gcd가 필요한데 음수가 있으면 gcd가 돌아가지를 않는다
// 그래서 일단 지역변수선언해서 그 지역변수의 연산만된 분수를 양수화 하고 약분하는 함수에 넣는다. Reduction에 넣으면 약분이 되어 참조자로 주소값이 참조되어 빠져나온다.
if (result_num % result_den == 0) // 약분했는데 분모가 분자로 나눠지는경우와 분모가 1인경우 분수를 정수로 표현하는 조건이다.
{
cout << "(" << num1 << "/" << den1 << ")+" << "(" << num2 << "/" << den2 << ")=" << result_num/result_den << endl;
}
else
{
cout << "(" << num1 << "/" << den1 << ")+" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
}
}
void Sub(int num1, int den1, int num2, int den2, int& result_num, int& result_den){
int sub_num, sub_den;
result_den = lcm(den1, den2);
result_num = (result_den / den1)*num1 - (result_den / den2)*num2;
if (result_den < 0 && result_num>0)
{
int minus_to_plus_den = -result_den;
Reduction(result_num, minus_to_plus_den, sub_num, sub_den);
}
else if (result_num < 0 && result_num>0)
{
int minus_to_plus_num = -result_num;
Reduction(minus_to_plus_num, result_den, sub_num, sub_den);
}
else if (result_den < 0 && result_num < 0)
{
result_den = -result_den;
result_num =-result_num;
Reduction(result_num, result_den, sub_num, sub_den);
}
if (result_num % result_den == 0)
{
cout << "(" << num1 << "/" << den1 << ")-" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
}
else{
cout << "(" << num1 << "/" << den1 << ")-" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
}
}
void Mpy(int num1, int den1, int num2, int den2, int& result_num, int& result_den){
int mpy_num, mpy_den;
result_num = num1*num2;
result_den = den1*den2;
if (result_den < 0 && result_num > 0)
{
int minus_to_plus_den = -result_den;
Reduction(result_num, minus_to_plus_den, mpy_num, mpy_den);
}
else if (result_num < 0 && result_num > 0)
{
int minus_to_plus_num = -result_num;
Reduction(minus_to_plus_num, result_den, mpy_num, mpy_den);
}
else if (result_den < 0 && result_num < 0)
{
result_den = -result_den;
result_num = -result_num;
Reduction(result_num, result_den, mpy_num, mpy_den);
}
if (result_num % result_den == 0)
{
cout << "(" << num1 << "/" << den1 << ")*" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
}
else
{
cout << "(" << num1 << "/" << den1 << ")*" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
}
}
void Div(int num1, int den1, int num2, int den2, int result_num, int result_den){
int div_num, div_den;
result_num = num1*den2;
result_den = num2*den1;
if (result_den < 0 && result_num>0)
{
int minus_to_plus_den = -result_den;
Reduction(result_num, minus_to_plus_den, div_num, div_den);
}
else if (result_num < 0 && result_num>0)
{
int minus_to_plus_num = -result_num;
Reduction(minus_to_plus_num, result_den, div_num, div_den);
}
else if (result_den < 0 && result_num < 0)
{
result_den = -result_den;
result_num = -result_num;
Reduction(result_num, result_den, div_num, div_den);
}
if (result_num % result_den == 0)
{
cout << "(" << num1 << "/" << den1 << ")/" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
}
else
{
cout << "(" << num1 << "/" << den1 << ")/" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
}
}
int lcm(int m, int n){
int m1 = m / gcd(n, m); // 최소공배수 통분했을때 나오는 최대공약수 제외한 나머지 값
int n1 = n / gcd(n, m);
return gcd(n, m) * m1 * n1; // 최대 공약수 랑 통분했을 시 나오는 수들의 곱셈
}
int gcd(int n, int m) {
if (m > n)
{
int temp;
temp = n;
n = m;
m = temp;
if (m == 0){
return n;
}
else
{
return gcd(m, n%m);
}
}
else
{
if (m == 0)
return n;
else
return gcd(m, n%m);
}
}
void Reduction(int num, int den, int& result_num, int& result_den) //reduction함수의 첫번째 두번째 인자는 사칙연산의 결과의 분자/분모이다.
{
gcd(num, den);
result_num = num / gcd(num, den);
result_den = den / gcd(num, den);
if (result_den == result_num)
{
result_den = 1;
result_num = 1;
}
}
//// Reduction 함수가 안돌아가는거같음... 약분이 안됨......
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIEFkZChpbnQgbnVtMSwgaW50IGRlbjEsIGludCBudW0yLCBpbnQgZGVuMiwgaW50ICYgcmVzdWx0X251bSwgaW50ICYgcmVzdWx0X2Rlbik7Cgp2b2lkIFN1YihpbnQgbnVtMSwgaW50IGRlbjEsIGludCBudW0yLCBpbnQgZGVuMiwgaW50JiByZXN1bHRfbnVtLCBpbnQmIHJlc3VsdF9kZW4pOwoKdm9pZCBNcHkoaW50IG51bTEsIGludCBkZW4xLCBpbnQgbnVtMiwgaW50IGRlbjIsIGludCYgcmVzdWx0X251bSwgaW50JiByZXN1bHRfZGVuKTsKCnZvaWQgRGl2KGludCBudW0xLCBpbnQgZGVuMSwgaW50IG51bTIsIGludCBkZW4yLCBpbnQgcmVzdWx0X251bSwgaW50IHJlc3VsdF9kZW4pOwoKaW50IGxjbShpbnQgbSwgaW50IG4pOwoKaW50IGdjZChpbnQgbiwgaW50IG0pOwoKdm9pZCBSZWR1Y3Rpb24oaW50IG51bSwgaW50IGRlbiwgaW50JiByZXN1bHRfbnVtLCBpbnQmIHJlc3VsdF9kZW4pOyAgLy9yZWR1Y3Rpb27tlajsiJjsnZgg7LKr67KI7Ke4IOuRkOuyiOynuCDsnbjsnpDripQg7IKs7LmZ7Jew7IKw7J2YIOqysOqzvOydmCDrtoTsnpAv67aE66qo7J2064ukLgoKaW50IG1haW4oKQp7CgkKCWludCBhLCBiLCBjLCBkOwoJCglpbnQgcmVzdWx0TnVtLCByZXN1bHREZW47CgoJY291dCA8PCAi67aE7J6QL+u2hOuqqOulvCDssKjroYDrjIDroZwg7J6F66Cl7ZWY7Iuc7JikKOu2hOuqqOyXkCAw64Sj7Jy866m0IEVycm9yISkiIDw8IGVuZGw7Cgljb3V0IDw8ICIo7J2M7IiY7J24IOu2hOyImOuKlCDrtoTsnpDsl5Ag7J2M7IiY66W8IOyeheugpe2VtOyjvOyEuOyalCAhISAgOiAiOwoJY2luID4+IGEgPj4gYiA+PiBjID4+IGQ7CgoJYXNzZXJ0KGIgIT0gMCAmJiBkICE9IDApOwoKCS8q66qo65OgIOyCrOy5meyXsOyCsCDqs4TsgrAg7ZWo7IiY7JeQIOyekOuPmSDslb3rtoTquYzsp4Ag65CY7Ja0IOyCsOy2nCovCglBZGQoYSwgYiwgYywgZCwgcmVzdWx0TnVtLCByZXN1bHREZW4pOyAvL+uNp+yFiAoKCVN1YihhLCBiLCBjLCBkLCByZXN1bHROdW0sIHJlc3VsdERlbik7IC8v67qE7IWICgogICAgTXB5KGEsIGIsIGMsIGQsIHJlc3VsdE51bSwgcmVzdWx0RGVuKTsgLy/qs7HshYgKCiAgICBEaXYoYSwgYiwgYywgZCwgcmVzdWx0TnVtLCByZXN1bHREZW4pOyAvL+uCmOuIl+yFiAoKCWNvdXQgPDwgZW5kbDsgIC8vIOq5lOuBlO2VnCDqsJztlokKCglyZXR1cm4gMDsgLy8g7KKF66OMCn0Kdm9pZCBBZGQoaW50IG51bTEsIGludCBkZW4xLCBpbnQgbnVtMiwgaW50IGRlbjIsIGludCAmIHJlc3VsdF9udW0sIGludCAmIHJlc3VsdF9kZW4pCnsKCglpbnQgYWRkX251bSwgYWRkX2RlbjsKCXJlc3VsdF9kZW4gPSBsY20oZGVuMSwgZGVuMik7CglyZXN1bHRfbnVtID0gKHJlc3VsdF9kZW4gLyBkZW4xKSpudW0xICsgKHJlc3VsdF9kZW4gLyBkZW4yKSpudW0yOwoKCWlmIChyZXN1bHRfZGVuIDwgMCAmJiByZXN1bHRfbnVtPjApCgl7CgkJaW50IG1pbnVzX3RvX3BsdXNfZGVuID0gLXJlc3VsdF9kZW47CgkJUmVkdWN0aW9uKHJlc3VsdF9udW0sIG1pbnVzX3RvX3BsdXNfZGVuLCBhZGRfbnVtLCBhZGRfZGVuKTsKCX0KCWVsc2UgaWYgKHJlc3VsdF9udW0gPCAwICYmIHJlc3VsdF9udW0+MCkKCXsKCQlpbnQgbWludXNfdG9fcGx1c19udW0gPSAtcmVzdWx0X251bTsKCQlSZWR1Y3Rpb24obWludXNfdG9fcGx1c19udW0sIHJlc3VsdF9kZW4sIGFkZF9udW0sIGFkZF9kZW4pOwoJfQoJZWxzZSBpZiAocmVzdWx0X2RlbiA8IDAgJiYgcmVzdWx0X251bSA8IDApCgl7CgkJcmVzdWx0X2RlbiA9IC1yZXN1bHRfZGVuOwoJCXJlc3VsdF9udW0gPSAtcmVzdWx0X251bTsKCQlSZWR1Y3Rpb24ocmVzdWx0X251bSwgcmVzdWx0X2RlbiwgYWRkX251bSwgYWRkX2Rlbik7Cgl9CgkvL+yhsOqxtCA6IOyXsOyCsOunjOuQmOqzoCDslb3rtoTsnbTslYjrkJwg67aE7IiY7J2YIOu2hOyekCwg67aE66qo7J2YIOydjOyImCDsl6zrtoDrpbwg7LK07YGs7ZWc64ukICDsnbTsnKDripQg7JW967aE7ZWY64qUIO2VqOyImChSZWR1Y3Rpb24p7JeQIGdjZOqwgCDtlYTsmpTtlZzrjbAg7J2M7IiY6rCAIOyeiOycvOuptCBnY2TqsIAg64+M7JWE6rCA7KeA66W8IOyViuuKlOuLpAoJLy8gICAgICAg6re4656Y7IScIOydvOuLqCDsp4Dsl63rs4DsiJjshKDslrjtlbTshJwg6re4IOyngOyXreuzgOyImOydmCDsl7DsgrDrp4zrkJwg67aE7IiY66W8IOyWkeyImO2ZlCDtlZjqs6Ag7JW967aE7ZWY64qUIO2VqOyImOyXkCDrhKPripTri6QuIFJlZHVjdGlvbuyXkCDrhKPsnLzrqbQg7JW967aE7J20IOuQmOyWtCDssLjsobDsnpDroZwg7KO87IaM6rCS7J20IOywuOyhsOuQmOyWtCDruaDsoLjrgpjsmKjri6QuCgkKCWlmIChyZXN1bHRfbnVtICUgcmVzdWx0X2RlbiA9PSAwKSAgLy8g7JW967aE7ZaI64qU642wIOu2hOuqqOqwgCDrtoTsnpDroZwg64KY64ig7KeA64qU6rK97Jqw7JmAIOu2hOuqqOqwgCAx7J246rK97JqwIOu2hOyImOulvCDsoJXsiJjroZwg7ZGc7ZiE7ZWY64qUIOyhsOqxtOydtOuLpC4KCXsKCQljb3V0IDw8ICIoIiA8PCBudW0xIDw8ICIvIiA8PCBkZW4xIDw8ICIpKyIgPDwgIigiIDw8IG51bTIgPDwgIi8iIDw8IGRlbjIgPDwgIik9IiA8PCByZXN1bHRfbnVtL3Jlc3VsdF9kZW4gPDwgZW5kbDsKCX0KCWVsc2UgIAoJewoJCWNvdXQgPDwgIigiIDw8IG51bTEgPDwgIi8iIDw8IGRlbjEgPDwgIikrIiA8PCAiKCIgPDwgbnVtMiA8PCAiLyIgPDwgZGVuMiA8PCAiKT0iIDw8IHJlc3VsdF9udW0gPDwgIi8iIDw8IHJlc3VsdF9kZW4gPDwgZW5kbDsKCX0KCQp9Cgp2b2lkIFN1YihpbnQgbnVtMSwgaW50IGRlbjEsIGludCBudW0yLCBpbnQgZGVuMiwgaW50JiByZXN1bHRfbnVtLCBpbnQmIHJlc3VsdF9kZW4pewoKCWludCBzdWJfbnVtLCBzdWJfZGVuOwoJcmVzdWx0X2RlbiA9IGxjbShkZW4xLCBkZW4yKTsKCXJlc3VsdF9udW0gPSAocmVzdWx0X2RlbiAvIGRlbjEpKm51bTEgLSAocmVzdWx0X2RlbiAvIGRlbjIpKm51bTI7CgoKCWlmIChyZXN1bHRfZGVuIDwgMCAmJiByZXN1bHRfbnVtPjApCgl7CgkJaW50IG1pbnVzX3RvX3BsdXNfZGVuID0gLXJlc3VsdF9kZW47CgkJUmVkdWN0aW9uKHJlc3VsdF9udW0sIG1pbnVzX3RvX3BsdXNfZGVuLCBzdWJfbnVtLCBzdWJfZGVuKTsKCX0KCWVsc2UgaWYgKHJlc3VsdF9udW0gPCAwICYmIHJlc3VsdF9udW0+MCkKCXsKCQlpbnQgbWludXNfdG9fcGx1c19udW0gPSAtcmVzdWx0X251bTsKCQlSZWR1Y3Rpb24obWludXNfdG9fcGx1c19udW0sIHJlc3VsdF9kZW4sIHN1Yl9udW0sIHN1Yl9kZW4pOwoJfQoJZWxzZSBpZiAocmVzdWx0X2RlbiA8IDAgJiYgcmVzdWx0X251bSA8IDApCgl7CgkJcmVzdWx0X2RlbiA9IC1yZXN1bHRfZGVuOwoJCXJlc3VsdF9udW0gPS1yZXN1bHRfbnVtOwoJCVJlZHVjdGlvbihyZXN1bHRfbnVtLCByZXN1bHRfZGVuLCBzdWJfbnVtLCBzdWJfZGVuKTsKCX0KCgoKCWlmIChyZXN1bHRfbnVtICUgcmVzdWx0X2RlbiA9PSAwKQoJewoJCWNvdXQgPDwgIigiIDw8IG51bTEgPDwgIi8iIDw8IGRlbjEgPDwgIiktIiA8PCAiKCIgPDwgbnVtMiA8PCAiLyIgPDwgZGVuMiA8PCAiKT0iIDw8IHJlc3VsdF9udW0gLyByZXN1bHRfZGVuIDw8IGVuZGw7Cgl9CgllbHNlewoJCWNvdXQgPDwgIigiIDw8IG51bTEgPDwgIi8iIDw8IGRlbjEgPDwgIiktIiA8PCAiKCIgPDwgbnVtMiA8PCAiLyIgPDwgZGVuMiA8PCAiKT0iIDw8IHJlc3VsdF9udW0gPDwgIi8iIDw8IHJlc3VsdF9kZW4gPDwgZW5kbDsKCX0KfQp2b2lkIE1weShpbnQgbnVtMSwgaW50IGRlbjEsIGludCBudW0yLCBpbnQgZGVuMiwgaW50JiByZXN1bHRfbnVtLCBpbnQmIHJlc3VsdF9kZW4pewoKCglpbnQgbXB5X251bSwgbXB5X2RlbjsKCXJlc3VsdF9udW0gPSBudW0xKm51bTI7CglyZXN1bHRfZGVuID0gZGVuMSpkZW4yOwoKCglpZiAocmVzdWx0X2RlbiA8IDAgJiYgcmVzdWx0X251bSA+IDApCgl7CgkJaW50IG1pbnVzX3RvX3BsdXNfZGVuID0gLXJlc3VsdF9kZW47CgkJUmVkdWN0aW9uKHJlc3VsdF9udW0sIG1pbnVzX3RvX3BsdXNfZGVuLCBtcHlfbnVtLCBtcHlfZGVuKTsKCX0KCWVsc2UgaWYgKHJlc3VsdF9udW0gPCAwICYmIHJlc3VsdF9udW0gPiAwKQoJewoJCWludCBtaW51c190b19wbHVzX251bSA9IC1yZXN1bHRfbnVtOwoJCVJlZHVjdGlvbihtaW51c190b19wbHVzX251bSwgcmVzdWx0X2RlbiwgbXB5X251bSwgbXB5X2Rlbik7Cgl9CgllbHNlIGlmIChyZXN1bHRfZGVuIDwgMCAmJiByZXN1bHRfbnVtIDwgMCkKCXsKCQlyZXN1bHRfZGVuID0gLXJlc3VsdF9kZW47CgkJcmVzdWx0X251bSA9IC1yZXN1bHRfbnVtOwoJCVJlZHVjdGlvbihyZXN1bHRfbnVtLCByZXN1bHRfZGVuLCBtcHlfbnVtLCBtcHlfZGVuKTsKCX0KCgoKCglpZiAocmVzdWx0X251bSAlIHJlc3VsdF9kZW4gPT0gMCkKCXsKCQljb3V0IDw8ICIoIiA8PCBudW0xIDw8ICIvIiA8PCBkZW4xIDw8ICIpKiIgPDwgIigiIDw8IG51bTIgPDwgIi8iIDw8IGRlbjIgPDwgIik9IiA8PCByZXN1bHRfbnVtIC8gcmVzdWx0X2RlbiA8PCBlbmRsOwoJfQoJZWxzZQoJewoJCWNvdXQgPDwgIigiIDw8IG51bTEgPDwgIi8iIDw8IGRlbjEgPDwgIikqIiA8PCAiKCIgPDwgbnVtMiA8PCAiLyIgPDwgZGVuMiA8PCAiKT0iIDw8IHJlc3VsdF9udW0gPDwgIi8iIDw8IHJlc3VsdF9kZW4gPDwgZW5kbDsKCX0KfQoKCnZvaWQgRGl2KGludCBudW0xLCBpbnQgZGVuMSwgaW50IG51bTIsIGludCBkZW4yLCBpbnQgcmVzdWx0X251bSwgaW50IHJlc3VsdF9kZW4pewoKCQoJaW50IGRpdl9udW0sIGRpdl9kZW47CglyZXN1bHRfbnVtID0gbnVtMSpkZW4yOwoJcmVzdWx0X2RlbiA9IG51bTIqZGVuMTsKCWlmIChyZXN1bHRfZGVuIDwgMCAmJiByZXN1bHRfbnVtPjApIAoJewoJCWludCBtaW51c190b19wbHVzX2RlbiA9IC1yZXN1bHRfZGVuOwoJCVJlZHVjdGlvbihyZXN1bHRfbnVtLCBtaW51c190b19wbHVzX2RlbiwgZGl2X251bSwgZGl2X2Rlbik7Cgl9CgllbHNlIGlmIChyZXN1bHRfbnVtIDwgMCAmJiByZXN1bHRfbnVtPjApCgl7CgkJaW50IG1pbnVzX3RvX3BsdXNfbnVtID0gLXJlc3VsdF9udW07CgkJUmVkdWN0aW9uKG1pbnVzX3RvX3BsdXNfbnVtLCByZXN1bHRfZGVuLCBkaXZfbnVtLCBkaXZfZGVuKTsKCX0KCWVsc2UgaWYgKHJlc3VsdF9kZW4gPCAwICYmIHJlc3VsdF9udW0gPCAwKQoJewoJCXJlc3VsdF9kZW4gPSAtcmVzdWx0X2RlbjsKCQlyZXN1bHRfbnVtID0gLXJlc3VsdF9udW07CgkJUmVkdWN0aW9uKHJlc3VsdF9udW0sIHJlc3VsdF9kZW4sIGRpdl9udW0sIGRpdl9kZW4pOwoJfQoJaWYgKHJlc3VsdF9udW0gJSByZXN1bHRfZGVuID09IDApCgl7CgkJY291dCA8PCAiKCIgPDwgbnVtMSA8PCAiLyIgPDwgZGVuMSA8PCAiKS8iIDw8ICIoIiA8PCBudW0yIDw8ICIvIiA8PCBkZW4yIDw8ICIpPSIgPDwgcmVzdWx0X251bSAvIHJlc3VsdF9kZW4gPDwgZW5kbDsKCX0KCWVsc2UKCXsKCQljb3V0IDw8ICIoIiA8PCBudW0xIDw8ICIvIiA8PCBkZW4xIDw8ICIpLyIgPDwgIigiIDw8IG51bTIgPDwgIi8iIDw8IGRlbjIgPDwgIik9IiA8PCByZXN1bHRfbnVtIDw8ICIvIiA8PCByZXN1bHRfZGVuIDw8IGVuZGw7Cgl9Cn0KCmludCBsY20oaW50IG0sIGludCBuKXsKCgkKCWludCBtMSA9IG0gLyBnY2QobiwgbSk7ICAvLyDstZzshozqs7XrsLDsiJgg7Ya167aE7ZaI7J2E65WMIOuCmOyYpOuKlCDstZzrjIDqs7Xslb3siJgg7KCc7Jm47ZWcIOuCmOuouOyngCDqsJIKCWludCBuMSA9IG4gLyBnY2QobiwgbSk7CgoJcmV0dXJuIGdjZChuLCBtKSAqIG0xICogbjE7ICAvLyDstZzrjIAg6rO17JW97IiYIOuekSDthrXrtoTtlojsnYQg7IucIOuCmOyYpOuKlCDsiJjrk6TsnZgg6rOx7IWICn0KCmludCBnY2QoaW50IG4sIGludCBtKSB7CgoJCWlmIChtID4gbikKCQl7CgkJCWludCB0ZW1wOwoJCQl0ZW1wID0gbjsKCQkJbiA9IG07CgkJCW0gPSB0ZW1wOwoKCQkJaWYgKG0gPT0gMCl7CgkJCQlyZXR1cm4gbjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBnY2QobSwgbiVtKTsKCQkJfQoKCSAgICB9CgkJZWxzZQoJCXsKCQkJaWYgKG0gPT0gMCkKCQkJCXJldHVybiBuOwoJCQllbHNlCgkJCQlyZXR1cm4gZ2NkKG0sIG4lbSk7CgoJCX0KCgl9CgoKCgp2b2lkIFJlZHVjdGlvbihpbnQgbnVtLCBpbnQgZGVuLCBpbnQmIHJlc3VsdF9udW0sIGludCYgcmVzdWx0X2RlbikgIC8vcmVkdWN0aW9u7ZWo7IiY7J2YIOyyq+uyiOynuCDrkZDrsojsp7gg7J247J6Q64qUIOyCrOy5meyXsOyCsOydmCDqsrDqs7zsnZgg67aE7J6QL+u2hOuqqOydtOuLpC4KewoKCWdjZChudW0sIGRlbik7CgoJcmVzdWx0X251bSA9IG51bSAvIGdjZChudW0sIGRlbik7CgoJcmVzdWx0X2RlbiA9IGRlbiAvIGdjZChudW0sIGRlbik7CgoKCWlmIChyZXN1bHRfZGVuID09IHJlc3VsdF9udW0pCgl7CgkJcmVzdWx0X2RlbiA9IDE7CgkJcmVzdWx0X251bSA9IDE7CgoJfQoKCn0KLy8vLyBSZWR1Y3Rpb24g7ZWo7IiY6rCAIOyViOuPjOyVhOqwgOuKlOqxsOqwmeydjC4uLiDslb3rtoTsnbQg7JWI65CoLi4uLi4uCgo=