1081. Rational Sum (20)
Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum.
Input Specification:
Each input file contains one test case. Each case starts with a positive integer N (<=100), followed in the next line N rational numbers "a1/b1 a2/b2 ..." where all the numerators and denominators are in the range of "long int". If there is a negative number, then the sign must appear in front of the numerator.
Output Specification:
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.
Sample Input 1:5 2/5 4/15 1/30 -2/60 8/3Sample Output 1:
3 1/3Sample Input 2:
2 4/3 2/3Sample Output 2:
2Sample Input 3:
3 1/3 -1/6 1/8Sample Output 3:
7/24
#include<stdio.h> #include<algorithm> using namespace std; struct faction{ long long up,down; }; long long gcb(long long a ,long long b)//求公约数 { long long x,y,temp; if(a>b){ x=a; y=b; }else{ x=b;y=a; } while(y!=0) { temp=x%y; x=y; y=temp; } return x; } faction huajian(faction result) { if(result.down<0) { result.down=-result.down; result.up=-result.up; } if(result.up==0) { result.down=1; }else{ int ret=gcb(abs(result.down),abs(result.up));//要加绝对值啊,否则错误 result.down=result.down/ret; result.up=result.up/ret; //printf("%d\n",ret); } return result; } faction add(faction s1,faction s2) { faction result; result.up=s1.up*s2.down+s2.up*s1.down; result.down=s1.down*s2.down; return huajian(result);//不能先huajian(result),再return result,这个错误找了很久 } void show_faction(faction s) { huajian(s); if(s.down==1) printf("%lld\n",s.up); else if(abs(s.up)>s.down){ printf("%lld %lld/%lld\n",s.up/s.down,abs(s.up)%s.down,s.down); }else{ printf("%lld/%lld\n",s.up,s.down); } } #if 1 int main() { int n; scanf("%d",&n); faction sum,temp; sum.up=0;sum.down=1; for(int i=0;i<n;i++){ scanf("%lld/%lld",&temp.up,&temp.down); sum=add(sum,temp); } show_faction(sum); //system("pause"); return 0; } #endif #if 0 int main()//调试的时候找不到错误用来测试最大公约数是否求对,证明对了 { long long n,m; scanf("%lld%lld",&n,&m); int ret=gcb(n,m); printf("%d",ret); system("pause"); return 0; } #endif