Day 31 算法笔记之数学问题 5.3 分数的四则运算

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;
}

Guess you like

Origin blog.csdn.net/aixiaoxiao13/article/details/121069704
5.3