1088 Rational Arithmetic (20分)分数问题:reduction,gcd,showresult,struct,manipulation

①注意在求最大公因子的时候,分子分母要取绝对值
②输出判断下0和小于0

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct fraction {
    
    
	ll up, down;
};
ll gcd(ll a,ll b)
{
    
    
	return b == 0 ? a : gcd(b, a % b);
}
fraction reduction(fraction a)
{
    
    
	if (a.down < 0)
	{
    
    
		a.down = -a.down;
		a.up = -a.up;
	}
	if (a.up == 0)
	{
    
    
		a.down = 1;
	}
	else {
    
    
		int d = gcd(abs(a.up), abs(a.down));
		a.up /= d;
		a.down /= d;
	}
	return a;
}
fraction add(fraction a, fraction b)
{
    
    
	fraction result;
	result.up = a.up * b.down + a.down * b.up;
	result.down = a.down * b.down;
	return reduction(result);
}
fraction difference(fraction a, fraction b)
{
    
    
	fraction result;
	result.up = a.up * b.down - a.down * b.up;
	result.down = a.down * b.down;
	return reduction(result);
}
fraction product(fraction a, fraction b)
{
    
    
	fraction result;
	result.up = a.up*b.up;
	result.down = a.down * b.down;
	return result;
}
fraction quotient(fraction a, fraction b)
{
    
    
	fraction result;
	result.up = a.up * b.down;
	result.down = a.down * b.up;
	return result;
}
void showresult(fraction a)
{
    
    
	a=reduction(a);
	if (a.up < 0)
		printf("(");
	if (a.down == 1)  printf("%lld", a.up);
    else if(a.down == 0) printf("Inf");
	else if (abs(a.up) > a.down) printf("%lld %lld/%lld", a.up / a.down, abs(a.up) % a.down, a.down);
	else
		printf("%d/%d", a.up, a.down);
	if (a.up < 0)
		printf(")");
}
int main()
{
    
    
	fraction m, n, result;
	scanf("%lld/%lld %lld/%lld", &m.up, &m.down, &n.up, &n.down);
	result = add(m, n);
	showresult(m);
	printf(" + ");
	showresult(n);
	printf(" = ");
	showresult(result);
	printf("\n");
	result = difference(m, n);
	showresult(m);
	printf(" - ");
	showresult(n);
	printf(" = ");
	showresult(result);
	printf("\n");
	result = product(m, n);
	showresult(m);
	printf(" * ");
	showresult(n);
	printf(" = ");
	showresult(result);
	printf("\n");
	result = quotient(m, n);
	showresult(m);
	printf(" / ");
	showresult(n);
	printf(" = ");
	showresult(result);
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42835526/article/details/113408735