PAT(甲级)1081

解题思路:分数的加法与分数的输出,注意要用long long运算,int相乘可能溢出
分数的化简:1.如果分母为负数,则分子分母同取相反数,目的是去掉分母上的负号。
2.如果分子为0,则分母改为1,目的是方便输出结果的时候进行判定。
3.分子分母化为最简分数,即找最小公约数化简。
分数的相加:按照手算的过程相加。
分数的输出:1.化简后分母为1,则直接输出分子。
2.分子绝对值>分母,带分数形式输出。
3.分子绝对值<分母,直接输出。
代码如下:

#include
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 0x3f3f3f3f
#define N 100000
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
ll gcd(ll a,ll b){
	return !b?a:gcd(b,a%b);
}
struct node{
	ll up,down;
};
node reduction(node 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;
} 
node add(node f1,node f2){//分数相加函数
	node result;
	result.down=f1.down*f2.down;
	result.up=f1.up*f2.down+f2.up*f1.down;
	return reduction(result);
}
void showresult(node result){//分数输出函数
	if(result.down==1){
		printf("%lld\n",result.up);
	}
	else{
		if(abs(result.up)>result.down){
			printf("%lld %lld/%lld\n",result.up/result.down,abs(result.up)%result.down,result.down);
		}
		else{
			printf("%lld/%lld\n",result.up,result.down);
		}
	}
}
int n;
int main() {
	cin>>n;
	node tmp,ans;
	scanf("%lld/%lld",&ans.up,&ans.down);
	reduction(ans);
	for(int i=1;i<n;i++){
		scanf("%lld/%lld",&tmp.up,&tmp.down);
		tmp=reduction(tmp);
		ans=add(ans,tmp);
	}
	showresult(ans);
	return 0;
}

你可能感兴趣的:(PAT(Advanced,C++版))