For each test case, output the sum in the simplest form "integer numerator/denominator" where "integer" is the integer part of the sum, "numerator" < "denominator", and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.
IDEA
1.主要最终/中间结果为0 的情况,则不用化简,找最大公约数,而是将结果直接赋值与初始化
CODE
#include<iostream> #include<cstdio> #include<vector> using namespace std; struct Num{ long long a; long long b; }; long long comm_divisor(Num num){ long long r,min,max; min=(num.a>num.b)?num.b:num.a; max=(num.a>num.b)?num.a:num.b; r=max%min; while(r){ max=min; min=r; r=max%min; } return min; } void simple(Num &num){ long long div=comm_divisor(num); num.a/=div; num.b/=div; } void output(Num num){ int flag=0; if(num.a<0){ num.a=-num.a; flag=1; } if(num.a==0){ printf("0"); }else{ long long c,d; c=num.a/num.b; d=num.a%num.b; if(flag){ if(d==0){ printf("-%lld",c); }else{ if(c==0){ printf("-%lld/%lld",num.a,num.b); }else{ printf("-%lld %lld/%lld",c,d,num.b); } } }else{ if(d==0){ printf("%lld",c); }else{ if(c==0){ printf("%lld/%lld",num.a,num.b); }else{ printf("%lld %lld/%lld",c,d,num.b); } } } } } int main(){ int n; while(~scanf("%d",&n)){ vector<Num> vec; for(int i=0;i<n;i++){ Num num; scanf("%lld/%lld",&num.a,&num.b); vec.push_back(num); } Num num; num.a=0,num.b=1; for(int i=0;i<n;i++){ num.a=num.a*vec[i].b+num.b*vec[i].a; num.b*=vec[i].b; if(num.a==0){ num.a=0; num.b=1; }else{ simple(num); } } //cout<<num.a<<" "<<num.b<<endl; output(num); cout<<endl; } return 0; }