模拟计算一些分数的和,结果以带分数的形式输出
注意一些细节即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
/*
模拟计算一些分数的和,结果以带分数的形式输出
注意一些细节即可
*/
const int maxn=;
const int maxv=; //long int范围实际上就是int的范围,sqrt(int)不超过50000
long long numerator[maxn]; //分子
long long denominator[maxn]; //分母
int n;
int maxexp[maxv];
int prime[maxv];
int cnt=;
int isprime[maxv];
/*
素数筛选法,筛选出素数
*/
void init(){
for(int i=;i<maxn;i++)
isprime[i]=;
isprime[]=;
for(int i=;i<maxv;i++){
if(isprime[i]){
prime[cnt++]=i;
for(int j=i*;j<maxv;j+=i)
isprime[j]=;
}
}
}
/*
分解质因数,顺便用来求LCM
*/
void factor(long long val){
for(int i=;i<cnt && val;i++){
int e=;
while(val%prime[i]==){
e++;
val/=prime[i];
}
maxexp[i]=max(maxexp[i],e); //LCM即为各个项的相同质因数取最大次数
}
//如果val本身是素数
if(val>){
prime[cnt]=val;
maxexp[cnt]=max(maxexp[cnt],);
cnt++;
}
}
long long GCD(long long a,long long b){
if(b==)
return a;
return GCD(b,a%b);
}
int main()
{
init();
memset(maxexp,,sizeof(maxexp));
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%lld/%lld",&numerator[i],&denominator[i]);
factor(denominator[i]);
}
long long lcm=;
for(int i=;i<cnt;i++){
for(int j=;j<maxexp[i];j++)
lcm*=prime[i];
}
long long sum=;
for(int i=;i<n;i++){
sum+=numerator[i]*(lcm/denominator[i]);
}
long long integer=sum/lcm;
long long left=sum%lcm;
if(integer!=)
printf("%lld",integer);
if(left!=){
if(integer!=)
printf(" ");
long long gcd=abs(GCD(left,lcm)); //注意这里要加绝对值,因为GDC(-12,9)=-3
printf("%lld/%lld",left/gcd,lcm/gcd);
}
//若结果为0
if(integer== && left==)
printf("0\n");
return ;
}

PAT甲题题解-1081. Rational Sum (20)-模拟分数计算的更多相关文章

  1. PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算

    输入为两个分数,让你计算+,-,*,\四种结果,并且输出对应的式子,分数要按带分数的格式k a/b输出如果为负数,则带分数两边要有括号如果除数为0,则式子中的结果输出Inf模拟题最好自己动手实现,考验 ...

  2. PAT甲题题解-1042. Shuffling Machine (20)-模拟

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789205.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  3. PAT甲题题解-1096. Consecutive Factors(20)-(枚举)

    题意:一个正整数n可以分解成一系列因子的乘积,其中会存在连续的因子相乘,如630=3*5*6*7,5*6*7即为连续的因子.给定n,让你求最大的连续因子个数,并且输出其中最小的连续序列. 比如一个数可 ...

  4. PAT甲题题解-1108. Finding Average (20)-字符串处理

    求给出数的平均数,当然有些是不符合格式的,要输出该数不是合法的. 这里我写了函数来判断是否符合题目要求的数字,有点麻烦. #include <iostream> #include < ...

  5. PAT甲题题解-1120. Friend Numbers (20)-水题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789775.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  6. PAT甲题题解-1041. Be Unique (20)-水题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789189.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  7. PAT甲题题解-1050. String Subtraction (20)-水题

    #include <iostream> #include <cstdio> #include <string.h> #include <algorithm&g ...

  8. PAT甲题题解-1015. Reversible Primes (20)-素数

    先判断n是否为素数然后把n转化成d进制下再反转,转化为十进制的num判断num是否为素数 注意n为0和1时,不是素数!!!注意反转后的num也有可能为1,不是素数!!! #include <io ...

  9. PAT甲题题解-1046. Shortest Distance (20)-做了一个假的最短路,水

    一开始以为是最短路,结果是给你一个环,让你求环上两点之间的距离...那还做毛线 然而还是得做毛线 #include <iostream> #include <cstdio> # ...

随机推荐

  1. 博客系统实战——SprintBoot 集成Thymeleaf 实现用户增删查改(含源码)

    近来在学习SprintBoot +Thymeleaf +Maven搭建自己的博客系统,故在学习过程中在此记录一下,也希望能给广大正在学习SprintBoot和Thymeleaf的朋友们一个参考. 以下 ...

  2. Ubuntu集群 配置ntp服务

    1.概述 NTP(Network Time Protocol)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN ...

  3. Volley源码分析(一)RequestQueue分析

    Volley源码分析 虽然在2017年,volley已经是一个逐渐被淘汰的框架,但其代码短小精悍,网络架构设计巧妙,还是有很多值得学习的地方. 第一篇文章,分析了请求队列的代码,请求队列也是我们使用V ...

  4. java.util.zip.ZipException: duplicate entry(重复依赖多版本的类库)

    同步SVN仓库中的代码,更新后,运行项目,出现如下错误: com.android.build.api.transform.TransformException: java.util.zip.ZipEx ...

  5. Kubernetes1.91(K8s)安装部署过程(四)--Master节点安装

    再次明确下架构:  三台虚拟机 centos 7.4系统,docker为17版本,ip为10.10.90.105到107,其中105位master,接下来的master相关组件安装到此机器上. etc ...

  6. STlinkSWD模式连线方式

    若使用SWD模式,则只需要连接4根线,7,9,20,1即SWDIO,SWDCLK,GND,VCC.VCC为3.3V

  7. 复习zabbix配置agent过程

    1. 创建主机configuration(配置)-->Hosts(主机)-->Create host(创建主机) 不使用proxy  ---  enabled 2.链接监控模板Templa ...

  8. odoo开发历史订单需求整体思路

    第一步:找到客户对应页面,并找到他所下过的销售订单,用数据库语句查出所有数据,并去除重复数据,显示在前端, sql="select DISTINCT t2.product_id as pro ...

  9. vi 替换

    在vi编辑器中,能够利用 :s命令能够实现字符串的替换.详细的使用方法例如以下: 1.:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串str1: 2.:s/str1/str2/ ...

  10. Go语言安全编码规范-翻译(分享转发)

    Go语言安全编码规范-翻译 本文翻译原文由:blood_zer0.Lingfighting完成 如果翻译的有问题:联系我(Lzero2012).匆忙翻译肯定会有很多错误,欢迎大家一起讨论Go语言安全能 ...