PAT A1081 Rational Sum 测试点3


#include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> #include<math.h> using namespace std; struct Fraction{ long long up,down; }sum,temp; long long gcd(long long a,long long b) { return b ==0 ? a : gcd(b,a%b); } 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 result; } 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; } void showResult(Fraction a) { a=reduction(a); if(a.down == 1) printf("%lld",a.up); else if( abs(a.up>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); } int main() { int n; cin >> n; sum.up=0,sum.down=1; for(int i=0;i<n;i++) { scanf("%lld/%lld",&temp.up,&temp.down); sum = Add(sum,temp); sum=reduction(sum); //关键!!! } showResult(sum); return 0; }

从算法笔记上学来的无法通过测试点3,如果在每次相加后的结果化简就能避免sum里面的数据膨胀

posted @ 2021-03-05 17:07  橘某  阅读(124)  评论(0)    收藏  举报