zoukankan      html  css  js  c++  java
  • PAT L1-009 N个数求和(运用GCD进行通分)

    题目链接:https://www.patest.cn/contests/gplt/L1-009

    题目:

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

    输入格式:

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

    输出格式:

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

    思路:首先这题是分数相加,其次,这题的分子分母都有可能是long long级的,先算分子的话极有可能爆long long,所以应该先将输入的数的分子分母进行约分,再将前面求得的结果与当前值进行通分,然后再进行约分。输出格式,其实就是将所得结果化成分子小于分母,举个例子就知道了,如3/2化成一又二分之一,即整数部分为1,分数部分为1/2。注意,本题有个坑点就是求得的分子最后为0,如果这里没处理好会卡最后一组数据(可能是因为我太菜才被这组数据卡的吧==!)。

    代码实现如下:

     1 #include <cstdio>
     2 #include <cmath>
     3 
     4 typedef long long ll;
     5 int n;
     6 ll a[105],b[105];
     7 ll p,q,ans;
     8 
     9 ll gcd(ll a,ll b){
    10     return b==0 ? a : gcd(b,a%b);
    11 }
    12 
    13 int main(){
    14     while(~scanf("%d",&n)){
    15         ll sump=0,sumq=0,gcdval;
    16         for(int i=0;i<n;i++){
    17             scanf("%lld/%lld",&a[i],&b[i]);
    18 
    19             gcdval=(sump==0 || sumq==0) ? 1:gcd(fabs(sump),fabs(sumq));
    20             sump=sump/gcdval,sumq=sumq/gcdval;
    21             gcdval=(a[i]==0 || b[i]==0) ? 1:gcd(fabs(a[i]),fabs(b[i]));
    22             a[i]/=gcdval,b[i]/=gcdval;
    23 
    24             if(sump==0 || sumq==0){
    25                 sump=a[i];
    26                 sumq=b[i];
    27             }
    28             else{
    29                 sump=sumq*a[i]+b[i]*sump;
    30                 sumq=b[i]*sumq;
    31             }
    32 
    33             gcdval=(sump==0 || sumq==0) ? 1:gcd(fabs(sump),fabs(sumq));
    34             sump=sump/gcdval,sumq=sumq/gcdval;
    35         }
    36 
    37         gcdval=(sump==0 || sumq==0) ? 1:gcd(fabs(sump),fabs(sumq));
    38         sump=sump/gcdval,sumq=sumq/gcdval;
    39 
    40         ll in=sump/sumq;
    41         if(in!=0){
    42             if(sump%sumq==0){
    43                 printf("%lld
    ",in);
    44             }
    45             else{
    46                 printf("%lld ",in);
    47             }
    48         }
    49         if(sump==0){
    50             printf("0
    ");
    51             continue;
    52         }
    53         if(sump%sumq){
    54             printf("%lld/%lld
    ",sump%sumq,sumq);
    55         }
    56     }
    57 }
    版权声明:本文允许转载,转载时请注明原博客链接,谢谢~
  • 相关阅读:
    NSFileHandle学习
    NSFileManager学习创建拷贝删除
    电量电费的尖峰平谷
    电表的付费模式
    电能表类型
    oracle递归
    相关子查询和非相关子查询
    再说exists 关键字,和inner join 差别大
    发电厂和电力局的关系
    js的toFixed()方法
  • 原文地址:https://www.cnblogs.com/Dillonh/p/8663327.html
Copyright © 2011-2022 走看看