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 }
    版权声明:本文允许转载,转载时请注明原博客链接,谢谢~
  • 相关阅读:
    用jmeter进行多用户并发压力测试 [转]
    jmeter 压力测试 参数
    web测试 结果存储类型为“Database”,但尚未指定结果储存库连接字符串
    apache配置多站点
    seajs + easyui [转]
    js,this,constrct ,prototype
    js call apply
    js this [转]
    [leetcode] Longest Common Prefix @ Python
    [leetcode] path sum @ Python [recursion]
  • 原文地址:https://www.cnblogs.com/Dillonh/p/8663327.html
Copyright © 2011-2022 走看看