PAT 1081. Rational Sum (20)
2015-09-03 16:57
387 查看
1081. Rational Sum (20)
时间限制400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
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/3
Sample Output 1:
3 1/3
Sample Input 2:
2 4/3 2/3
Sample Output 2:
2
Sample Input 3:
3 1/3 -1/6 1/8
Sample Output 3:
7/24
这道题先用辗转相除法求GCD,然后就可以求出LCM,然后就是要小心一些细节上的判断就好了。代码如下:
#include <iostream> #include <algorithm> #include <cmath> #include <cstring> using namespace std; long int gcd(long int x,long int y) { while(y) { long int rem=x%y; x=y; y=rem; } return x; } long int lcm(long int a,long int b) { return a*b/gcd(a,b); } int main(void) { int N; cin>>N; long int num[100],den[100]; for(int i=0;i<N;i++) scanf("%ld/%ld",&num[i],&den[i]); long int resultNum=0,resultDen=1; for(int i=0;i<N;i++) resultDen=lcm(resultDen,den[i]); for(int i=0;i<N;i++) resultNum+=resultDen/den[i]*num[i]; long int first=0; bool flag=true; if(resultNum<0) { flag=false; resultNum=-resultNum; } if(resultNum>resultDen) { first=resultNum/resultDen; resultNum%=resultDen; } if(resultNum==0) { if(first>0) cout<<first; else cout<<0; return 0; } long int g=gcd(resultNum,resultDen); resultNum/=g; resultDen/=g; if(flag==false) cout<<"-"; if(first!=0) cout<<first<<" "; cout<<resultNum<<"/"<<resultDen; }
相关文章推荐
- lintcode-硬币排成一条线
- 迭代器模式(一):销售管理系统中数据的遍历
- web_reg_find和web_find的区别
- spark源码剖析之----Partitioner
- shell里面的test用法
- HDU 4568【最短路+状压DP】
- 各种杂项组件(3)之--CalendarView(日历视图)、DatePicker/TimePicker(日期、时间选择器)、NumberPicker(数值选择器)
- PhotoView源码分析(1)
- 原型继承
- c++ primer读书笔记之c++11(三)
- 一对多的单项关联
- linux之用户管理
- 4.Realm(数据处理,交互)
- Unity3D学习笔记《Space Shooter》二
- C语言实验题——三个数排序
- 将两个数组合并并排序
- 第31-35课
- BZOJ 1026: [SCOI2009]windy数( dp )
- 已知: 每个飞机只有一个油箱, 飞机之间可以相互加油(注意是相互,没有加油机) 一箱油可供一架飞机绕地球飞半圈,问题:为使至少一架飞机绕地球一圈回到起飞时的飞机
- 检测出运动目标后提取边界 两个函数 cvFindContours和cvBoundingRect