700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > n个数求和 java_暴力+辗转相除法——N个数求和

n个数求和 java_暴力+辗转相除法——N个数求和

时间:2020-05-07 23:33:39

相关推荐

n个数求和 java_暴力+辗转相除法——N个数求和

题目来源

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

题目描述

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

输入格式:

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

输出格式:

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

样例:

输入样例1:

5

2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2

4/3 2/3

输出样例2:

2

输入样例3:

3

1/3 -1/6 1/8

输出样例3:

7/24

思路

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

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

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

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

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

代码

1 #include

using namespace std;

int n,o=1,oo; char x=1; //o-结果是否为非负数 oo-当前输入的有理数是否为非负数

long long p,q,f=0,g=1,c;

inline long long read(); //快读 由于分子分母间有‘/’分隔且分母一定是正数 标准快读模板即可完成

inline int yue(long long a,long long b);//求a和b的最大公约数

int main()

{

scanf("%d",&n);

for(int i=1;i<=n;i++)

{

while(!(x>=48&&x<=57)&&x!='-')

x=getchar();

if(x=='-') oo=0;

else oo=1; //判断当前输入的有理数是否为非负数

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=0,f=p-f;

}

else if(!o&&oo)

{

if(f>=p)

o=1,f-=p;

else

f=p-f;

}

int u=yue(f,g); //u为f和g的最大公约数

f/=u;

g/=u; //约分

}

if(o==0) printf("-"); //如果结果是负数 输出负号

if(f==0) printf("0"); //如果结果是0 输出0

else if(f%g==0) printf("%lld",f/g); //如果结果可以约分为整数

else if(g%f==0) printf("1/%lld",g/f);//如果结果可以约分为“1/x”形式

else if(f>g) //如果结果的分子大于分母 即结果为假分数 需要转化为带分数

{

printf("%lld ",f/g); //整数部分

f%=g;

printf("%lld/%lld",f,g); //分数部分

}

else

printf("%lld/%lld",f,g); //如果结果为真分数

return 0;

}

inline int yue(long long a,long long b) //欧几里得算法 亲测暴力约分会超时

{

if(a>b) c=a,a=b,b=c;

while(a!=0) //

{

while(b>=a) //标准%运算比较慢 直接减

b-=a;

c=a,a=b,b=c;

}

return b;

}

inline long long read()

{

long long s=0;

while(!(x>=48&&x<=57))

x=getchar();

while(x>=48&&x<=57)

s*=10,s+=x-48,x=getchar();

return s;

}

吐槽

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

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[暴力+辗转相除法——N个数求和]/tech/detail-121247.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
N个数求和 (20 分)

N个数求和 (20 分)

2020-08-04

N个数求和 (20分)

N个数求和 (20分)

2021-09-10

L1-009. N个数求和

L1-009. N个数求和

2022-08-05

L1-009 N个数求和

L1-009 N个数求和

2023-09-25