PAT A1081 Rational Sum

Rational Sum

题意:用程序模拟分数的加法。
首先定义一个结构体来存储分子,分母。
因为分子分母都是int类型,相乘有可能溢出,所以用long long 类型保存。

typedef long long ll;
struct Fraction
{
	ll up, down;
};

分子分母表示时必须是最简的,所以分子分母要同时除以最大公约数。
最大公约数:假设有两个int类型的数据a,b(a > b), 而a = kb + r;设d为a,b的公约数,而r = kb - a,所以d也为r的公约数。而
r = a % b,所以d也为b,a%b的公约数。而寻找a, b的公约数可以近一步缩小为b,a%b的公约数。当a%b == 0时,说明a = nb,所以此时b是最大公约数。
所以最大公约数求法:

int gcd(ll a, ll b)
{
	if(b == 0)
	return a;
	else
	return gcd(b, a%b);
}

EXTRA:最大公倍数:ab/d,有时ab会溢出,可以用a/db;
分数的化简:

Fraction reduction(Fraction result){
	if(result.down < 0)
	{
		result.up = -result.up;
		result.down = -result.down;
	}//分母小于0时,分子取相反数,分母变为正数好输出
	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 a, Fraction b)
{
	Fraction result;
	result.up = a.up * b.down + b.up * a.down;
	//减法这里+号改为减号
	result.down = a.down * b.down;
	return reduction(result);
}

乘法:

Fraction mul(Fraction a, Fraction b)
{
	Fraction result;
	result.up = a.up * b.up;
	result.down = a.down * b.down;
	return reduction(result);
}

除法:

Fraction div(Fraction a, Fraction b)
{
	Fraction result;
	result.up = a.up * b.down;
	result.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) > a.down)
	{
		printf("%lld %lld/%lld\n", a.up/a.down, abs(a.up) % a.down, a.down);
	}
	else
	printf("%lld/%lld\n", a.up, a.down);
}

完整程序:

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
struct Fraction
{
	ll up, down;
};
int gcd(ll a, ll b)
{
	return !b ? a : gcd(b, a % b);
}
Fraction reduction(Fraction result){
	if(result.down < 0)
	{
		result.up = -result.up;
		result.down = -result.down;
	}
	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 a, Fraction b)
{
	Fraction result;
	result.up = a.up * b.down + b.up * a.down;
	result.down = a.down * b.down;
	return reduction(result);
}

void showResult(Fraction a)
{
	reduction(a);
	if(a.down == 1)
	{
		printf("%lld\n", a.up);
	}
	else if(abs(a.up) > a.down)
	{
		printf("%lld %lld/%lld\n", a.up/a.down, abs(a.up) % a.down, a.down);
	}
	else
	printf("%lld/%lld\n", a.up, a.down);
}

int main()
{
	int n;
	Fraction sum, temp;
	sum.up = 0;
	sum.down = 1;
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
	{
		scanf("%lld/%lld", &temp.up, &temp.down);
		sum = add(sum, temp);
	}
	showResult(sum);
	return 0;
}
发布了17 篇原创文章 · 获赞 0 · 访问量 113

猜你喜欢

转载自blog.csdn.net/weixin_45486992/article/details/105057110