题目来源

PTA 团体程序设计天梯赛-练习集 L1-009 N个数求和 (20分)

https://pintia.cn/problem-sets/994805046380707840/problems/994805133597065216

题目描述

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

样例:

输入样例1:

/ / / -/ /

输出样例1:

 /

输入样例2:

/ /

输出样例2:


输入样例3:

/ -/ /

输出样例3:

/

思路

从题目“分子/分母”的输入形式可以看出我们不能采用scanf和cin直接输输入值 而要采用字符输入再转换为数值

计算过程中判断好符号 暴力通分直接加减即可

防止通分过程超出长整型范围 最好每一步结果都约分

我最开始暴力约分来着 发现会超时 就用欧几里得算法了 不麻烦也不会超时

输出时注意题目要求的形式 想仔细一点每种条件怎么输出即可

代码

 #include <cstdio>
using namespace std;
int n,o=,oo; char x=; //o-结果是否为非负数 oo-当前输入的有理数是否为非负数
long long p,q,f=,g=,c;
inline long long read(); //快读 由于分子分母间有‘/’分隔且分母一定是正数 标准快读模板即可完成
inline int yue(long long a,long long b);//求a和b的最大公约数
int main()
{
  scanf("%d",&n);
  for(int i=;i<=n;i++)
11   {
    while(!(x>=&&x<=)&&x!='-')
      x=getchar();
    if(x=='-') oo=;
    else oo=; //判断当前输入的有理数是否为非负数
16     p=read();
    q=read(); //以“|p/q|”形式读入当前有理数
    p*=g;
    f*=q;
    g*=q; //暴力通分 本题数据范围内没有超出长整型
    if((o&&oo)||(!o&&!oo)) //如果结果和当前输入有理数同号 只要分子绝对值部分相加即可
      f+=p;
    else if(o&&!oo) //如果结果为正 当前输入有理数为负 则需要比较结果与当前输入有理数的大小来确定此次运算后结果的符号
    {
      if(f>=p) //当前结果大于当前输入有理数的绝对值 结果仍为正数 以下同理
        f-=p;
      else
        o=,f=p-f;
    }
    else if(!o&&oo)
    {
      if(f>=p)
        o=,f-=p;
      else
        f=p-f;
    }
    int u=yue(f,g); //u为f和g的最大公约数
    f/=u;
    g/=u; //约分
  }
  if(o==) printf("-"); //如果结果是负数 输出负号
42   if(f==) printf(""); //如果结果是0 输出0
  else if(f%g==) printf("%lld",f/g); //如果结果可以约分为整数
  else if(g%f==) printf("1/%lld",g/f);//如果结果可以约分为“1/x”形式
  else if(f>g) //如果结果的分子大于分母 即结果为假分数 需要转化为带分数
  {
    printf("%lld ",f/g); //整数部分
    f%=g;
49     printf("%lld/%lld",f,g); //分数部分
  }
  else
52     printf("%lld/%lld",f,g); //如果结果为真分数
  return ;
}
inline int yue(long long a,long long b) //欧几里得算法 亲测暴力约分会超时
{
  if(a>b) c=a,a=b,b=c;
  while(a!=) //
  {
    while(b>=a) //标准%运算比较慢 直接减
      b-=a;
    c=a,a=b,b=c;
  }
  return b;
}
inline long long read()
{
  long long s=;
  while(!(x>=&&x<=))
    x=getchar();
  while(x>=&&x<=)
    s*=,s+=x-,x=getchar();
  return s;
}

吐槽

很少见到PTA这样AC红WA绿的平台了 属实清新脱俗:)

暴力+辗转相除法——N个数求和的更多相关文章

  1. 团体程序设计天梯赛-练习集L1-009. *N个数求和

    L1-009. N个数求和 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题的要求很简单,就是求N个数字的和.麻烦的是,这些 ...

  2. #020PAT 没整明白的题L1-009 N个数求和 (20 分)

    后面的测试点过不去,两个错误一个超时. 目前未解决   L1-009 N个数求和 (20 分)   本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和 ...

  3. Java:多个数求和

    设计思想: 先定义int n,定义输入数的个数,输入一个新建的动态数组,输入数字存入动态数组中,函数转换并求和,最后输出. 程序流程图: 源程序代码: package com; import java ...

  4. bzoj 2327 构图暴力判断+独立集个数

    首先我们可以处理出10^6以内的所有的勾股数,如果我们有2*i-1和2*j互质, 那么A=(2*i-1)*(2*i-1)+(2*i-1)*(2*j),B=2*j*j+(2*i-1)*(2*j)为互质 ...

  5. 天梯赛 L1-009 N个数求和 (模拟)

    本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=1 ...

  6. c++---天梯赛---N个数求和

    ★题目: ★难点:要求只能以有理数和分数去输出结果. ★分析:可以对输入的数据进行通分处理,随后把结果按格式输出. ★代码: #include<iostream> #include< ...

  7. 约数个数求和+线性筛约数——bzoj3994

    这题首先要会线性筛约数个数,并求出前缀和 bool vis[maxn]; int mm,mu[maxn],prime[maxn],num[maxn],sum[maxn],d[maxn],sum1[ma ...

  8. L1-009. N个数求和

    https://www.patest.cn/contests/gplt/L1-009 原来写的找了好久还是有一个测试点没过, 虽说是道水题,但是今天一遍就过了还是挺高兴的. 送你机组数据 52/5 4 ...

  9. PAT L1-009. N个数求和

    本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=100).随后一行按格 ...

随机推荐

  1. Java 内部类(成员内部类、局部内部类、静态内部类,匿名内部类)

    一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用publ ...

  2. LG承认手机业务遭到中国厂商碾压!这是输得心服口服的节奏?

    近日,关于LG手机业退出中国市场的消息传的沸沸洋洋.不少相关媒体也对此事向LG北京办事处求证,得到的结果确实是手机业务退出中国市场.并且据韩媒报道,LG还将会逐渐取消高端手机业务,也就是说未来V系列和 ...

  3. 变身六次失去核心的小米Note还能火吗

    奥特曼变身有时间限制,因此我们总是希望它多变几次身,从而把小怪兽打得嗷嗷叫.但对于科技产品来说,不断推出"变身版",似乎总有江河日下.大势已去之感.三星形形色色的复仇者联盟S6版, ...

  4. C2C的道德边界:沦为从假运单到假病条的供假渠道

    你可能刚开始学会不去看网购平台上商品回评中的虚假好评,却又要开始应对同事在朋友圈等平台买来的虚开病假条带来的困扰.最近各大媒体包括党报热传的网购病假条事件,再度将人们的目光集中在这个C2C模式之上.从 ...

  5. css进阶之二:flex弹性布局

    布局模式是指一个盒子与其兄弟.祖先盒的关系决定其尺寸与位置的算法.css2.1中定义了四种布局模式,分别是块布局.行内布局.表格布局.以及定位布局.css3引入了新的布局模式Flexbox布局,灵活度 ...

  6. selenium+requests进行cookies保存读取操作

    看这篇文章之前大家可以先看下我的上一篇文章:cookies详解 本篇我们就针对上一篇来说一下cookies的基本应用 使用selenium模拟登陆百度 from selenium import web ...

  7. 弹性盒子Flex Box滚动条原理,避免被撑开,永不失效

    在HTML中,要实现区域内容的滚动,只需要设定好元素的宽度和高度,然后设置CSS属性overflow 为auto或者scroll:   在Flex box布局中,有时我们内容的宽度和高度是可变的,无法 ...

  8. Linux centos7.0 配置防火墙及开放端口

    现在防火墙有两种服务1.service firewalld 2.service iptables 一.就firewalld来说查看开放的端口  netstat  -anp 查询防火墙状态  servi ...

  9. koa01

    1.koa简介 koa是express团队开发的一个更加轻量级的服务端开发框架,也是未来的趋势 2.安装 npm i -g koa-generator //全局安装koa脚手架 3.创建项目 koa2 ...

  10. 前端面试题(HTML、CSS部分)

    HTML.CSS部分: 一.html5有哪些新特性.移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?   新特性: HTML5 现在已经不是 SGML 的 ...