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. ...
随机推荐
- Codeforces Round #460 E. Congruence Equation
Description 题面 \(n*a^n≡b (\mod P),1<=n<=x\) Solution 令 \(n=(P-1)*i+j\) \([(P-1)*i+j]*a^{[(P-1) ...
- POJ 1486二分图的必要边
题意:有n个大小不等透明的幻灯片(只有轮廓和上面的数字可见)A.B.C.D.E…按顺序叠放在一起,现在知道每个幻灯片大小,由于幻灯片是透明的,所以能看到幻灯片上的数字(给出了每个数字的坐标,但不知道这 ...
- ssh远程登陆
ssh远程登录命令简单实例 ssh命令用于远程登录上Linux主机. 常用格式:ssh [-l login_name] [-p port] [user@]hostname 更详细的可以用ssh ...
- wpf中静态资源和动态资源的区别
静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了. 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源.
- MySQl之最全且必会的sql语句
创建一个名称为mydb1的数据库,如果有mydb1数据库则直接使用,如果无则创建mydb1数据库 create database if not exists mydb1; create databas ...
- Linux学习之CentOS(八)----详解文件的搜寻、查找(转)
which (寻找『运行档』) [root@www ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 分 ...
- JAVA虚拟机:对象的创建过程
简要说明的话,Java对象的创建过程分为下面几步: 1.执行相关检查: 2.为对象分配内存,将分配到的内存空间都初始化为零值: 3.进行构造代码块和构造函数的初始化 下面详细介绍这几个步骤: 1.执行 ...
- 模块机制 之commonJs、node模块 、AMD、CMD
在其他高级语言中,都有模块中这个概念,比如java的类文件,PHP有include何require机制,JS一开始就没有模块这个概念,起初,js通过<script>标签引入代码的方式显得杂 ...
- 列表ListBox、ListView、GridView 排序
列表排序 1.使用控件默认排序方式(推荐) ListControl.Items.SortDescriptions.Clear(); ListControl.Items.SortDescriptions ...
- JAVA 第二天 基本数据类型
在栈中可以直接分配内存的数据是基本数据类型.引用数据类型:数据的引用在栈中,但他的对象在堆中. 基本数据类型,小可转大,大转小会失去精度 第一类:逻辑型boolean 第二类:文本型char 第三类: ...