PAT A1081 Rational Sum

博客主要讲述了在解决PAT A1081题目的过程中,遇到测试点3不通过的问题。作者通过在每次计算后进行有理数的化简,最终成功解决了这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试点3不过,后来在每一次计算后都进行化简后过。

#include <iostream>
using namespace std;
struct node
{
	long long int son;
	long long int dad;
};
int Gcd(long long int a,long long int b)//最大公约数
{
	long long int z=b;
	while (a%b != 0)
	{
		z = a % b;
		a = b;
		b = z;
	}
	return z;
}
void Change(long long int a, long long int b)
{
	long long int x=a*b/Gcd(a, b);

}
int main()
{
	int n;
	cin >> n;
	int i;
	node x;
	node sum;
	sum.son = 0;
	sum.dad = 1;
	 long long int dad = 0;
	for (i = 0; i < n; i++)
	{
		cin >> x.son;
		getchar();
		cin >> x.dad;
		if (x.dad < 0)
		{
			x.son = 0 - x.son;
			x.dad = 0 - x.dad;
		}
		dad =sum.dad*x.dad/ Gcd(sum.dad, x.dad);
		sum.son = dad / sum.dad*sum.son+ dad / x.dad*x.son;
		sum.dad = dad;
		//测试点3
		long long int p = abs(Gcd(sum.son, sum.dad));//最小公倍数
		sum.son = sum.son / p;
		sum.dad = sum.dad / p;
	}
	long long int c=0;
	if (sum.son >= sum.dad)
	{
		c = sum.son / sum.dad;
		sum.son = sum.son - c * sum.dad;
	}
	int flag = 0;
	if (c)
	{
		cout << c;
		flag = 1;
	}
	//化简
    long long p = abs(Gcd(sum.son, sum.dad));//最小公倍数
	sum.son = sum.son / p;
	sum.dad = sum.dad / p;

	if (sum.son)
	{
		if (c)cout << " ";
		cout << sum.son << "/" << sum.dad;
		flag = 1;
	}
	if (flag == 0)cout << "0";
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值