#include <cstdlib>
#include <iostream>
using namespace std;
class Fraction {
private:
int num,den; //числитель и знаменатель
public:
Fraction(){set(0,1);}
Fraction(int n,int d){set(n,d);}
void set (int n,int d) {num=n; den=d;
normalize();}
int get_num() {return num;}
int get_den(){return den;}
Fraction add(Fraction other);
Fraction mult(Fraction other);
private:
void normalize();//преобразов. дроби в стандартн форм
int gcf(int a,int b);//наибольший общий делитель
int lcm(int a,int b);//наименьшее общее кратное
};
int main(){
Fraction f1,f2;
Fraction f3(1,3);
cout<<"The value of f1 is";
cout<<f1.get_num()<<"/";
cout<<f1.get_den()<<endl;
cout<<"The value of f3 is";
cout<<f3.get_num()<<"/";
cout<<f3.get_den()<<endl;
return 0;
}
//нормализация : преобразовать дробь к стандартному
//виду ,уникальному для каждого математически отличающегося
//значения
void Fraction::normalize(){
//обработать случаи со значением 0
if(den==0 || num==0){
num=0;
den=1;
}
//оставить отрицательный знак только в числителе.
if(den<0){
num*=-1;
den*=-1;
}
//извлечение наибольшего общего делителя из числителя и
//знаменателя.
int n=gcf(num,den);
num=num/n;
den=den/n;
}
//наибольший общий делитель
int Fraction::gcf(int a,int b){
if(a%b==0)
return abs(b);
else
return gcf(b,a%b);
}
//наименьшее общее кратное
int Fraction::lcm(int a,int b){
return (a/gcf(a,b))*b;
}
Fraction Fraction::add(Fraction other){
Fraction fract;
int lcd=lcm(den,other.den);
int quot1=lcd/den;
int quot2=lcd/other.den;
fract.set(num*quot1+other.num*quot2, lcd);
fract.normalize();
return fract;
}
Fraction Fraction::mult(Fraction other){
Fraction fract;
fract.set(num*other.num, den* other.den);
fract.normalize();
return fract;
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY2xhc3MgRnJhY3Rpb24gewoJcHJpdmF0ZToKCWludCBudW0sZGVuOyAvL9GH0LjRgdC70LjRgtC10LvRjCDQuCDQt9C90LDQvNC10L3QsNGC0LXQu9GMCglwdWJsaWM6CglGcmFjdGlvbigpe3NldCgwLDEpO30KCUZyYWN0aW9uKGludCBuLGludCBkKXtzZXQobixkKTt9Cgl2b2lkIHNldCAoaW50IG4saW50IGQpIHtudW09bjsgZGVuPWQ7Cglub3JtYWxpemUoKTt9CglpbnQgZ2V0X251bSgpIHtyZXR1cm4gbnVtO30KCWludCBnZXRfZGVuKCl7cmV0dXJuIGRlbjt9CglGcmFjdGlvbiBhZGQoRnJhY3Rpb24gb3RoZXIpOwoJRnJhY3Rpb24gbXVsdChGcmFjdGlvbiBvdGhlcik7Cglwcml2YXRlOgoJdm9pZCBub3JtYWxpemUoKTsvL9C/0YDQtdC+0LHRgNCw0LfQvtCyLiDQtNGA0L7QsdC4INCyINGB0YLQsNC90LTQsNGA0YLQvSDRhNC+0YDQvAoJaW50IGdjZihpbnQgYSxpbnQgYik7Ly/QvdCw0LjQsdC+0LvRjNGI0LjQuSDQvtCx0YnQuNC5INC00LXQu9C40YLQtdC70YwKCWludCBsY20oaW50IGEsaW50IGIpOy8v0L3QsNC40LzQtdC90YzRiNC10LUg0L7QsdGJ0LXQtSDQutGA0LDRgtC90L7QtQp9OwppbnQgbWFpbigpewoJRnJhY3Rpb24gZjEsZjI7CglGcmFjdGlvbiBmMygxLDMpOwoJY291dDw8IlRoZSB2YWx1ZSBvZiBmMSBpcyI7Cgljb3V0PDxmMS5nZXRfbnVtKCk8PCIvIjsKCWNvdXQ8PGYxLmdldF9kZW4oKTw8ZW5kbDsKCWNvdXQ8PCJUaGUgdmFsdWUgb2YgZjMgaXMiOwoJY291dDw8ZjMuZ2V0X251bSgpPDwiLyI7Cgljb3V0PDxmMy5nZXRfZGVuKCk8PGVuZGw7CglyZXR1cm4gMDsKfQoJCi8v0L3QvtGA0LzQsNC70LjQt9Cw0YbQuNGPIDog0L/RgNC10L7QsdGA0LDQt9C+0LLQsNGC0Ywg0LTRgNC+0LHRjCDQuiDRgdGC0LDQvdC00LDRgNGC0L3QvtC80YMKLy/QstC40LTRgyAs0YPQvdC40LrQsNC70YzQvdC+0LzRgyDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0LzQsNGC0LXQvNCw0YLQuNGH0LXRgdC60Lgg0L7RgtC70LjRh9Cw0Y7RidC10LPQvtGB0Y8KLy/Qt9C90LDRh9C10L3QuNGPCnZvaWQgRnJhY3Rpb246Om5vcm1hbGl6ZSgpewoJLy/QvtCx0YDQsNCx0L7RgtCw0YLRjCDRgdC70YPRh9Cw0Lgg0YHQviDQt9C90LDRh9C10L3QuNC10LwgMAoJaWYoZGVuPT0wIHx8IG51bT09MCl7CgkJbnVtPTA7CgkJZGVuPTE7Cgl9CgkvL9C+0YHRgtCw0LLQuNGC0Ywg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0Lkg0LfQvdCw0Log0YLQvtC70YzQutC+INCyINGH0LjRgdC70LjRgtC10LvQtS4KCWlmKGRlbjwwKXsKCQludW0qPS0xOwoJCWRlbio9LTE7Cgl9CgkvL9C40LfQstC70LXRh9C10L3QuNC1INC90LDQuNCx0L7Qu9GM0YjQtdCz0L4g0L7QsdGJ0LXQs9C+INC00LXQu9C40YLQtdC70Y8g0LjQtyDRh9C40YHQu9C40YLQtdC70Y8g0LggCgkvL9C30L3QsNC80LXQvdCw0YLQtdC70Y8uCglpbnQgbj1nY2YobnVtLGRlbik7CgludW09bnVtL247CglkZW49ZGVuL247Cn0KLy/QvdCw0LjQsdC+0LvRjNGI0LjQuSDQvtCx0YnQuNC5INC00LXQu9C40YLQtdC70YwKaW50IEZyYWN0aW9uOjpnY2YoaW50IGEsaW50IGIpewoJaWYoYSViPT0wKQoJcmV0dXJuIGFicyhiKTsKCWVsc2UKCXJldHVybiBnY2YoYixhJWIpOwp9Ci8v0L3QsNC40LzQtdC90YzRiNC10LUg0L7QsdGJ0LXQtSDQutGA0LDRgtC90L7QtQppbnQgRnJhY3Rpb246OmxjbShpbnQgYSxpbnQgYil7CglyZXR1cm4gKGEvZ2NmKGEsYikpKmI7Cn0KRnJhY3Rpb24gRnJhY3Rpb246OmFkZChGcmFjdGlvbiBvdGhlcil7CglGcmFjdGlvbiBmcmFjdDsKCWludCBsY2Q9bGNtKGRlbixvdGhlci5kZW4pOwoJaW50IHF1b3QxPWxjZC9kZW47CglpbnQgcXVvdDI9bGNkL290aGVyLmRlbjsKCWZyYWN0LnNldChudW0qcXVvdDErb3RoZXIubnVtKnF1b3QyLCBsY2QpOwoJZnJhY3Qubm9ybWFsaXplKCk7CglyZXR1cm4gZnJhY3Q7Cn0KRnJhY3Rpb24gRnJhY3Rpb246Om11bHQoRnJhY3Rpb24gb3RoZXIpewoJRnJhY3Rpb24gZnJhY3Q7CglmcmFjdC5zZXQobnVtKm90aGVyLm51bSwgZGVuKiBvdGhlci5kZW4pOwoJZnJhY3Qubm9ybWFsaXplKCk7CglyZXR1cm4gZnJhY3Q7Cn0K