#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);}
Fraction(Fraction const &src);
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(3,4);
Fraction f2(f1);
Fraction f3=f1.add(f2);
cout<<"значение f3 такое ";
cout<<f3.get_num()<<"/";
cout<<f3.get_den()<<endl;
return 0;
}
//Функции класса fraction
Fraction::Fraction(Fraction const &src){
cout<<"Теперь вызывается конструктор копирования."<<endl;
num=src.num;
den=src.den;
}
//нормализация : преобразовать дробь к стандартному
//виду ,уникальному для каждого математически отличающегося
//значения
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+CiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY2xhc3MgRnJhY3Rpb24gewoJcHJpdmF0ZToKCWludCBudW0sZGVuOyAvL9GH0LjRgdC70LjRgtC10LvRjCDQuCDQt9C90LDQvNC10L3QsNGC0LXQu9GMCglwdWJsaWM6CglGcmFjdGlvbigpe3NldCgwLDEpOwoJfQoJRnJhY3Rpb24oaW50IG4saW50IGQpe3NldChuLGQpO30KCQkKRnJhY3Rpb24oRnJhY3Rpb24gY29uc3QgJnNyYyk7Cgl2b2lkIHNldCAoaW50IG4saW50IGQpIHtudW09bjsgZGVuPWQ7bm9ybWFsaXplKCk7fQoJaW50IGdldF9udW0oKSB7cmV0dXJuIG51bTt9CglpbnQgZ2V0X2Rlbigpe3JldHVybiBkZW47fQoJRnJhY3Rpb24gYWRkKEZyYWN0aW9uIG90aGVyKTsKCUZyYWN0aW9uIG11bHQoRnJhY3Rpb24gb3RoZXIpOwoJCglwcml2YXRlOgoJdm9pZCBub3JtYWxpemUoKTsvL9C/0YDQtdC+0LHRgNCw0LfQvtCyLiDQtNGA0L7QsdC4INCyINGB0YLQsNC90LTQsNGA0YLQvSDRhNC+0YDQvAoJaW50IGdjZihpbnQgYSxpbnQgYik7Ly/QvdCw0LjQsdC+0LvRjNGI0LjQuSDQvtCx0YnQuNC5INC00LXQu9C40YLQtdC70YwKCWludCBsY20oaW50IGEsaW50IGIpOy8v0L3QsNC40LzQtdC90YzRiNC10LUg0L7QsdGJ0LXQtSDQutGA0LDRgtC90L7QtQp9OwppbnQgbWFpbigpewoJCglGcmFjdGlvbiBmMSgzLDQpOwoJRnJhY3Rpb24gZjIoZjEpOwoJRnJhY3Rpb24gZjM9ZjEuYWRkKGYyKTsKCQoJY291dDw8ItC30L3QsNGH0LXQvdC40LUgZjMg0YLQsNC60L7QtSAgIjsKCWNvdXQ8PGYzLmdldF9udW0oKTw8Ii8iOwoJY291dDw8ZjMuZ2V0X2RlbigpPDxlbmRsOwoJcmV0dXJuIDA7Cn0KCS8v0KTRg9C90LrRhtC40Lgg0LrQu9Cw0YHRgdCwIGZyYWN0aW9uCkZyYWN0aW9uOjpGcmFjdGlvbihGcmFjdGlvbiBjb25zdCAmc3JjKXsKCWNvdXQ8PCLQotC10L/QtdGA0Ywg0LLRi9C30YvQstCw0LXRgtGB0Y8g0LrQvtC90YHRgtGA0YPQutGC0L7RgCDQutC+0L/QuNGA0L7QstCw0L3QuNGPLiI8PGVuZGw7CgludW09c3JjLm51bTsKCWRlbj1zcmMuZGVuOwp9CQovL9C90L7RgNC80LDQu9C40LfQsNGG0LjRjyA6INC/0YDQtdC+0LHRgNCw0LfQvtCy0LDRgtGMINC00YDQvtCx0Ywg0Log0YHRgtCw0L3QtNCw0YDRgtC90L7QvNGDCi8v0LLQuNC00YMgLNGD0L3QuNC60LDQu9GM0L3QvtC80YMg0LTQu9GPINC60LDQttC00L7Qs9C+INC80LDRgtC10LzQsNGC0LjRh9C10YHQutC4INC+0YLQu9C40YfQsNGO0YnQtdCz0L7RgdGPCi8v0LfQvdCw0YfQtdC90LjRjwp2b2lkIEZyYWN0aW9uOjpub3JtYWxpemUoKXsKCS8v0L7QsdGA0LDQsdC+0YLQsNGC0Ywg0YHQu9GD0YfQsNC4INGB0L4g0LfQvdCw0YfQtdC90LjQtdC8IDAKCWlmKGRlbj09MCB8fCBudW09PTApewoJCW51bT0wOwoJCWRlbj0xOwoJfQoJLy/QvtGB0YLQsNCy0LjRgtGMINC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C5INC30L3QsNC6INGC0L7Qu9GM0LrQviDQsiDRh9C40YHQu9C40YLQtdC70LUuCglpZihkZW48MCl7CgkJbnVtKj0tMTsKCQlkZW4qPS0xOwoJfQoJLy/QuNC30LLQu9C10YfQtdC90LjQtSDQvdCw0LjQsdC+0LvRjNGI0LXQs9C+INC+0LHRidC10LPQviDQtNC10LvQuNGC0LXQu9GPINC40Lcg0YfQuNGB0LvQuNGC0LXQu9GPINC4IAoJLy/Qt9C90LDQvNC10L3QsNGC0LXQu9GPLgoJaW50IG49Z2NmKG51bSxkZW4pOwoJbnVtPW51bS9uOwoJZGVuPWRlbi9uOwp9Ci8v0L3QsNC40LHQvtC70YzRiNC40Lkg0L7QsdGJ0LjQuSDQtNC10LvQuNGC0LXQu9GMCmludCBGcmFjdGlvbjo6Z2NmKGludCBhLGludCBiKXsKCWlmKGElYj09MCkKCXJldHVybiBhYnMoYik7CgllbHNlCglyZXR1cm4gZ2NmKGIsYSViKTsKfQovL9C90LDQuNC80LXQvdGM0YjQtdC1INC+0LHRidC10LUg0LrRgNCw0YLQvdC+0LUKaW50IEZyYWN0aW9uOjpsY20oaW50IGEsaW50IGIpewoJcmV0dXJuIChhL2djZihhLGIpKSpiOwp9CkZyYWN0aW9uIEZyYWN0aW9uOjphZGQoRnJhY3Rpb24gb3RoZXIpewoJRnJhY3Rpb24gZnJhY3Q7CglpbnQgbGNkPWxjbShkZW4sb3RoZXIuZGVuKTsKCWludCBxdW90MT1sY2QvZGVuOwoJaW50IHF1b3QyPWxjZC9vdGhlci5kZW47CglmcmFjdC5zZXQobnVtKnF1b3QxK290aGVyLm51bSpxdW90MiwgbGNkKTsKCWZyYWN0Lm5vcm1hbGl6ZSgpOwoJcmV0dXJuIGZyYWN0Owp9CkZyYWN0aW9uIEZyYWN0aW9uOjptdWx0KEZyYWN0aW9uIG90aGVyKXsKCUZyYWN0aW9uIGZyYWN0OwoJZnJhY3Quc2V0KG51bSpvdGhlci5udW0sIGRlbiogb3RoZXIuZGVuKTsKCWZyYWN0Lm5vcm1hbGl6ZSgpOwoJcmV0dXJuIGZyYWN0Owp9