题目来源

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. IPFS问题总结

    1.安装包下载 ipfs安装版本下载:https://github.com/ipfs/go-ipfs/releases,这是IPFS的go语言实现版,目前实现的还有js版本. 2.安装与启动 linu ...

  2. (七)spring+druid多数据源配置

    druid多数据源配置 一.druid简介 Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. ...

  3. ES6的模块暴露与模块引入

    ES6的模块暴露和引入可以让我们实现模块化编程,以下列出ES6的几种模块暴露与引入的方式与区别. 1.ES6一共有三种模块暴露方法 多行暴露 模块1:module1.js //多行暴露 export ...

  4. 线程中断 interrupt 和 LockSupport

    本文章将要介绍的内容有以下几点,读者朋友也可先自行思考一下相关问题: 线程中断 interrupt 方法怎么理解,意思就是线程中断了吗?那当前线程还能继续执行吗? 判断线程是否中断的方法有几个,它们之 ...

  5. Neural Turing Machine - 神经图灵机

    Neural Turing Machine - 神经图灵机 论文原文地址: http://arxiv.org/pdf/1410.5401.pdf 一般的神经网络不具有记忆功能,输出的结果只基于当前的输 ...

  6. Channel Estimation for High Speed Wireless Systems using Gaussian Particle Filter and Auxiliary Particle Filter

    目录 论文来源 摘要 基本概念 1.时变信道 2.粒子滤波 3.高斯粒子滤波 4.辅助粒子滤波 比较 借鉴之处 论文来源 International Conference on Communicati ...

  7. java反序列化-ysoserial-调试分析总结篇(4)

    1.前言 这篇文章继续分析commoncollections4利用链,这篇文章是对cc2的改造,和cc3一样,cc3是对cc1的改造,cc4则是对cc2的改造,里面chained的invoke变成了i ...

  8. Windows激活服务器搭建

    1.下载服务端的安装包,下载地址: https://github.com/Wind4/vlmcsd/releases 注意,下载编译好的包省时间,名称为:binaries.tar.gz 或者直接下载我 ...

  9. 基于netty的群聊

    基于netty的群聊 学了一段时间的netty知识,现在通过这个基于console的程序来对netty的相关接口做个简单的应用. 准备 依赖 <dependency> <groupI ...

  10. SPA那点事

    前端猿一天不学习就没饭吃了,后端猿三天不学习仍旧有白米饭摆于桌前.IT行业的快速发展一直在推动着前端技术栈在不断地更新换代,前端的发展成了互联网时代的一个缩影.而单页面应用的发展给前端猿分了一杯羹. ...