首页 > 其他 > 详细

PTA N个数求和

时间:2021-04-01 22:58:24      阅读:18      评论:0      收藏:0      [点我收藏+]

本题的要求很简单,就是求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

这道题我前前后后大概做了两个小时,我现在来总结一下思路和测试点。

我是用数组分别来储存分子和分母的,然后通分,得到通分后的分子和分母,求分子和分母的最大公因数,再通分一次,然后输出结果。

求最大公因数可以采用辗转相除法。

PS:1.需要讨论第一次通分后的分子为0的情况。

2.讨论第一次通分后分子小于0的情况,输出时如果有整数,把负号放在整数前面;否则,把负号放在分子前面。

3.分子分母为长整数型,定义时需要注意。

 

 1 #include<stdio.h>
 2 typedef long ll;
 3 ll get(ll a,ll b){
 4     ll rem;
 5     while(b>0){
 6         rem=a%b;
 7         a=b;
 8         b=rem;
 9     }
10     return a;
11 }
12 int main(){
13     int i,num;
14     ll a[101],b[101],sum=0,x=1,t,a1;
15     scanf("%d",&num);
16     for(i=0;i<num;i++){
17         scanf("%ld/%ld",&a[i],&b[i]);
18     }
19     for(i=0;i<num;i++){
20         x*=b[i];
21     }
22     for(i=0;i<num;i++){
23         a[i]=x/b[i]*a[i];
24         sum+=a[i];        
25     }
26     if(sum==0){
27      printf("0");
28      return 0;
29      } 
30     if(sum<0){
31         sum*=(-1);
32         printf("-");
33         }
34     t=get(sum,x);
35     sum=sum/t;
36     x= x/t;
37         if(sum>x){
38             if(sum%x==0){
39              printf("%ld",sum/x);
40             }else{
41              a1=sum%x;
42              sum-=a1;
43              printf("%ld %ld/%ld",sum/x,a1,x);
44             }
45         }else if(sum<x){
46              printf("%ld/%ld",sum,x);   
47         }else{
48             printf("%ld",sum/x);
49         } 
50     return 0;
51 }

 

该题的链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805133597065216

 

PTA N个数求和

原文:https://www.cnblogs.com/8023yyl/p/14607669.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!