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/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
题目要求对分数进行处理,题目的关键在于求取最大公约数,最初我采用了循环出现超时,后来改用辗转相除法,解决了此问题。需要注意的是分子为负数的情况,为方便处理,我们把负数取绝对值,并且记录下符号,最后再输出。
辗转相除法如下:
给定数a、b,要求他们的最大公约数,用任意一个除以另一个,得到余数c,如果c=0,则说明除尽,除数就是最大公约数;如果c≠0,则用除数再去除以余数,如此循环下去,直至c=0,则除数就是最大公约数,直接说比较抽象,下面用例子说明。
设a=25,b=10,c为余数
①25/10,c=5≠0,令a=10,b=5。
②10/5,c=0,则b=5就是最大公约数。
求取最大公约数的代码如下:
long getMaxCommon(long a, long b){
long yu;
if(a == b) return a;
while(1){
yu = a % b;
if(yu == 0) return b;
a = b;
b = yu;
}
}
完整代码如下:
#include <iostream>
#include <stdio.h>
#include <vector> using namespace std; struct Ration{
long num;
long den; Ration(long _n, long _d){
num = _n;
den = _d;
} }; long getMaxCommon(long a, long b){
long yu;
if(a == b) return a;
while(1){
yu = a % b;
if(yu == 0) return b;
a = b;
b = yu;
}
} int main(){
int N;
long num,den;
long maxDen = -1;
cin >> N;
vector<Ration> rations;
for(int i = 0; i < N; i++){
scanf("%ld/%ld",&num,&den);
rations.push_back(Ration(num,den));
if(maxDen == -1){
maxDen = den;
}else{
// 找maxDen和当前的最小公倍数
if(den == maxDen) continue;
else if(maxDen > den){
if(maxDen % den == 0) continue;
}else{
if(den % maxDen == 0){
maxDen = den;
continue;
}
}
maxDen = maxDen * den;
}
}
num = 0;
for(int i = 0; i < N; i++){
num += rations[i].num * (maxDen / rations[i].den);
}
if(num == 0) {
printf("0\n");
return 0;
}
bool negative = num < 0;
if(negative) num = -num;
if(num >= maxDen){
long integer = num / maxDen;
long numerator = num % maxDen;
if(numerator == 0){
if(negative)
printf("-%ld\n",integer);
else
printf("%ld\n",integer);
return 0;
}
long common = getMaxCommon(numerator,maxDen);
if(negative){
printf("%ld -%ld/%ld\n",integer,numerator/common,maxDen / common);
}else{
printf("%ld %ld/%ld\n",integer,numerator/common,maxDen / common);
}
}else{
long common = getMaxCommon(num,maxDen);
if(negative)
printf("-%ld/%ld\n",num/common,maxDen/common);
else
printf("%ld/%ld\n",num/common,maxDen/common);
}
return 0;
}
1081. Rational Sum (20) -最大公约数的更多相关文章
- PAT Advanced 1081 Rational Sum (20) [数学问题-分数的四则运算]
题目 Given N rational numbers in the form "numerator/denominator", you are supposed to calcu ...
- 1081. Rational Sum (20)
the problem is from PAT,which website is http://pat.zju.edu.cn/contests/pat-a-practise/1081 the code ...
- PAT甲题题解-1081. Rational Sum (20)-模拟分数计算
模拟计算一些分数的和,结果以带分数的形式输出注意一些细节即可 #include <iostream> #include <cstdio> #include <algori ...
- 【PAT甲级】1081 Rational Sum (20 分)
题意: 输入一个正整数N(<=100),接着输入N个由两个整数和一个/组成的分数.输出N个分数的和. AAAAAccepted code: #define HAVE_STRUCT_TIMESPE ...
- PAT (Advanced Level) 1081. Rational Sum (20)
简单模拟题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...
- PAT 1081 Rational Sum
1081 Rational Sum (20 分) Given N rational numbers in the form numerator/denominator, you are suppo ...
- pat1081. Rational Sum (20)
1081. Rational Sum (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given N ...
- PAT 1081 Rational Sum[分子求和][比较]
1081 Rational Sum (20 分) Given N rational numbers in the form numerator/denominator, you are suppose ...
- 1081 Rational Sum(20 分)
Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum. ...
随机推荐
- ●BZOJ 2049 [Sdoi2008]Cave洞穴勘测
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2049 题解: LCT入门题 就是判两个点是否在同一颗树里 代码: #include<c ...
- remove、erase
remove: remove不是真正的删除,删除后数量并没有变化. 它接收一对迭代器,而不是一个容器,所以不知道它作用于哪个容器. 而且没有办法从一个迭代器获取对应于它的容器 实现 remove会用需 ...
- [USACO12OPEN]书架Bookshelf
Description 当农夫约翰闲的没事干的时候,他喜欢坐下来看书.多年过去,他已经收集了 N 本书 (1 <= N <= 100,000), 他想造一个新的书架来装所有书. 每本书 i ...
- bzoj2127
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 2492 Solved: 1205[Submit][Status][D ...
- java 之 MyBatis(sql 可以执行,在eclipse执行报错问题)
前段时间写 mybatis Sql 查询语句的时候,发现一个很奇怪的现象,我写的SQL 语句在 pl/Sql 中明明可以执行,但是放到 eclipse 中执行却报错,因为时间比较久,依稀记得是文字与字 ...
- python+eclipse+pydev开发环境搭建
1.安装配置python2.7(右击我的电脑->属性->高级系统设置->环境变量->系统变量列表中找到Path并双击->变量值中添加";C:\Python27; ...
- 笔记12 注入AspectJ切面
虽然Spring AOP能够满足许多应用的切面需求,但是与AspectJ相比, Spring AOP 是一个功能比较弱的AOP解决方案.AspectJ提供了Spring AOP所不能支持的许多类型的切 ...
- C语言程序设计第五次作业——循环结构(1)
一.改错题 1.题目 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下:c = 5×( ...
- YOLO2:实时目标检测视频教程,视频演示, Android Demo ,开源教学项目,论文。
实时目标检测和分类 GIF 图: 视频截图: 论文: https://arxiv.org/pdf/1506.02640.pdf https://arxiv.org/pdf/1612.08242.pdf ...
- h5的input的required使用中遇到的问题
form提交时隐藏input发生的错误 问题描述 在form表单提交的时候,有些input标签被隐藏,表单验证过程中会出现An invalid form control with name='' is ...