暴力+辗转相除法——N个数求和
题目来源
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个数求和的更多相关文章
- 团体程序设计天梯赛-练习集L1-009. *N个数求和
L1-009. N个数求和 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题的要求很简单,就是求N个数字的和.麻烦的是,这些 ...
- #020PAT 没整明白的题L1-009 N个数求和 (20 分)
后面的测试点过不去,两个错误一个超时. 目前未解决 L1-009 N个数求和 (20 分) 本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和 ...
- Java:多个数求和
设计思想: 先定义int n,定义输入数的个数,输入一个新建的动态数组,输入数字存入动态数组中,函数转换并求和,最后输出. 程序流程图: 源程序代码: package com; import java ...
- 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)为互质 ...
- 天梯赛 L1-009 N个数求和 (模拟)
本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=1 ...
- c++---天梯赛---N个数求和
★题目: ★难点:要求只能以有理数和分数去输出结果. ★分析:可以对输入的数据进行通分处理,随后把结果按格式输出. ★代码: #include<iostream> #include< ...
- 约数个数求和+线性筛约数——bzoj3994
这题首先要会线性筛约数个数,并求出前缀和 bool vis[maxn]; int mm,mu[maxn],prime[maxn],num[maxn],sum[maxn],d[maxn],sum1[ma ...
- L1-009. N个数求和
https://www.patest.cn/contests/gplt/L1-009 原来写的找了好久还是有一个测试点没过, 虽说是道水题,但是今天一遍就过了还是挺高兴的. 送你机组数据 52/5 4 ...
- PAT L1-009. N个数求和
本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=100).随后一行按格 ...
随机推荐
- MySQL rand(随机数)、floor(保留整数)、char(ASCII 转字符)、concat(字符串连接)
一.MySQL的rand()函数 select rand(); rand()函数,随机0-1之间的数. 二.获得0-10之间的整数(包含0,不包含10) ; 其中floor()去掉小数. 三.获得指定 ...
- Java 内部类(成员内部类、局部内部类、静态内部类,匿名内部类)
一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用publ ...
- JSF技术web.xml配置解析
对Java tutorial-examples中jsf hell1的web.xml配置文件的解析 <?xml version="1.0" encoding="UTF ...
- js 实现排序算法 -- 插入排序(Insertion Sort)
原文: 十大经典排序算法(动图演示) 插入排序 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, ...
- 查漏补缺:进程间通信(IPC):FIFO
1.FIFO FIFO,又称命名管道.不同于pipe管道的只能用于拥有共同祖先进程的两个进程间通信,因FIFO通过路径绑定,所以即使是不相关的进程间也可通过FIFO进行数据交换. FIFO是一种文件类 ...
- AndroidManifest.xml文件详解
本文为安全专家李洋的最新一篇专栏文章<AndroidManifest.xml文件详解>.AndroidManifest.xml是一个跟安全相关的配置文件,该配置文件是Android安全保障 ...
- PS4游戏将登陆PC:一曲属于主机的悲歌
曾经,红白机.PS游戏机等成为一代人难以磨灭的记忆.而随后的索尼PS3.微软Xbox 360.任天堂Wii U等,也称霸了次时代主机时代,成为家庭娱乐的中心.但面对着依托于PC和智能移动终端 ...
- win10 64位 安装JDK1.8
win10 64位 jdk1.8 配置Java环境,是否安装JRE. 一.安装得有JRE JDK和JRE分别安装再不同的文件夹下 新建:JAVA_HOME 值:JDK的安装路径 新建:CLASSPAT ...
- [翻译]python3中新的字符串格式化方法-----f-string
从python3.6开始,引入了新的字符串格式化方式,f-字符串. 这使得格式化字符串变得可读性更高,更简洁,更不容易出现错误而且速度也更快. 在本文后面,会详细介绍f-字符串的用法. 在此之前,让我 ...
- CentOS 7下Apache + PHP + MySQL环境(LAMP)的安装
Step 1:更换阿里云 yum 源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7 ...