int gcb(int a,int b){
if(b==0) return a;
else return gcb(b,a%b);
}
struct fraction{
long long up,down;
};
fraction reduction(fraction result){
if(result.down<0){
result.down=-result.down;
result.up=-result.up;
}
if(result.up==0){
result.down=1;
}else{
int d = gcd(abs(result.up),abs(result.down));
result.up/=d;
result.down/=d;
}
return result;
}
fraction add(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.down+f1.down*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
fraction add(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.down+f1.down*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
fraction add(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.down-f1.down*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
fraction add(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
fraction add(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.down;
result.down=f1.down*f2.up;
return reduction(result);
}
void showresult(fraction r){
r = reduction(r);
if(r.down==1) printf("%lld",r.up);
else if(abs(r.up)>r.down){
printf("%d %d/%d",r.up/r.down,abs(r.up)%r.down,r.down);
}else{
printf("%d/%d",r.up,r.down)
}
}
1.Ration Sum
#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <sys/time.h>
using namespace std;
typedef long long ll;
ll gcb(ll a,ll b){
if(b==0) return a;
else return gcb(b,a%b);
}
struct fraction{
long long up,down;
};
fraction reduction(fraction result){
if(result.down<0){
result.down=-result.down;
result.up=-result.up;
}
if(result.up==0){
result.down=1;
}else{
int d = gcb(abs(result.up),abs(result.down));
result.down/=d;
result.up/=d;
}
return result;
}
fraction add(fraction a,fraction b){
fraction result;
result.down = a.down*b.down;
result.up=a.up*b.down+a.down*b.up;
return reduction(result);
}
void showresult(fraction a){
reduction(a);
if(a.down==1) printf("%lld\n",a.up);
else if(abs(a.up)>abs(a.down)) printf("%lld %lld/%lld\n",a.up/a.down,a.up%a.down,a.down);
else printf("%lld/%lld\n",a.up,a.down);
}
int main(){
int n;
scanf("%d",&n);
fraction final,temp;
final.down=1,final.up=0;
for(int i=0;i<n;i++){
scanf("%lld/%lld",&temp.up,&temp.down);
final = add(final,temp);
}
showresult(final);
return 0;
}
2.Rational Arithmetic
#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <sys/time.h>
using namespace std;
typedef long long ll;
ll gcb(ll a,ll b){
if(b==0) return a;
else return gcb(b,a%b);
}
struct fraction{
long long up,down;
}a,b;
fraction reduction(fraction result){
if(result.down<0){
result.down=-result.down;
result.up=-result.up;
}
if(result.up==0){
result.down=1;
}else{
int d = gcb(abs(result.up),abs(result.down));
result.down/=d;
result.up/=d;
}
return result;
}
fraction add(fraction a,fraction b){
fraction result;
result.down = a.down*b.down;
result.up=a.up*b.down+a.down*b.up;
return reduction(result);
}
fraction minuss(fraction a,fraction b){
fraction result;
result.down = a.down*b.down;
result.up=a.up*b.down-a.down*b.up;
return reduction(result);
}
fraction multi(fraction a,fraction b){
fraction result;
result.down = a.down*b.down;
result.up=a.up*b.up;
return reduction(result);
}
fraction derive(fraction a,fraction b){
fraction result;
result.down = a.down*b.up;
result.up=a.up*b.down;
return reduction(result);
}
void showresult(fraction a){
a = reduction(a);
if(a.up<0) printf("(");
if(a.down==1) printf("%lld",a.up);
else if(abs(a.up)>abs(a.down)) printf("%lld %lld/%lld",a.up/a.down,abs(a.up)%a.down,a.down);
else printf("%lld/%lld",a.up,a.down);
if(a.up<0) printf(")");
}
int main(){
scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
showresult(a);
printf(" + ");
showresult(b);
printf(" = ");
showresult(add(a,b));
printf("\n");
showresult(a);
printf(" - ");
showresult(b);
printf(" = ");
showresult(minuss(a,b));
printf("\n");
showresult(a);
printf(" * ");
showresult(b);
printf(" = ");
showresult(multi(a,b));
printf("\n");
showresult(a);
printf(" / ");
showresult(b);
printf(" = ");
if(b.up==0){
printf("Inf");
}else{
showresult(derive(a,b));
}
printf("\n");
return 0;
}