pta基础题目集:N个数求和 (20 分)

7-5 N个数求和 (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

 解析:这道题的主要考察点是化简分数,所以一定会用到函数gcd(a,b)来求最大公约数从而求出它的最简形式;另外一定要注意它的输出形式。正确代码如下:

#include
using namespace std;
typedef long L;        //将常整形long用变量L表示,为下面的使用更简洁 
L fz=0,fm=1;        //定义全局变量fz,fm 
int gcd(L a,L b){     
    return b?gcd(b,a%b):a;    //递归法求最大公约数
}
void sum(L a,L b){    //求两个分数的和以及化简 
    L m=a*fm+b*fz;
    L n=fm*b;
    L t=gcd(m,n);
    fz=m/t;
    fm=n/t;
}
int main(){
    L a,b;
    int p;
    char c;
    cin>>p;
    for(int i=0;i         cin>>a>>c>>b;    //输入分子,/,和分母 
        sum(a,b);        //调用sum对输入的分数求和 
    }
    if(fz%fm==0) cout<     else if(fz>fm) cout<     else cout<     return 0;
}
除了这个方法之外我还有另一种方法,但是只得到了17分,还有一个测试点答案未通过,目前尚未找出毛病,等知道到了再来更新。代码如下:

#include
using namespace std;
typedef long L;
L gcd(L a,L b){
    return b?gcd(b,a%b):a;
}
int main(){
    L n,a[110],b[110],i;
    char c;
    cin>>n;
    for(i=0;i         cin>>a[i]>>c>>b[i];
    int fz=a[0],fm=b[0];
    for(i=1;i     {
        int t=fm*b[i]/gcd(fm,b[i]); //最小公倍数
         int r1=t/fm,r2=t/b[i];
          fz=fz*r1+a[i]*r2;
          fm=t;
          int f=gcd(fz,fm);
          fz/=f;
        fm/=f;
    }
    
    if(fz%fm==0) cout<     else if(fz>fm) cout<     else cout<     return 0;
}
方法2更改的正确代码如下:

#include
using namespace std;
typedef long long  L;
L gcd(L a,L b){
    return b?gcd(b,a%b):a;
}
int main(){
    L n,a[110],b[110],i;
    char c;
    cin>>n;
    for(i=0;i         cin>>a[i]>>c>>b[i];
    L fz=a[0],fm=b[0];
    if(n==1){
        L u=gcd(fz,fm);
          fz/=u;
        fm/=u;
    }
    else{
        for(i=1;i     {
        L t=fm*b[i]/gcd(fm,b[i]); //最小公倍数
         L r1=t/fm,r2=t/b[i];
          fz=fz*r1+a[i]*r2;
          fm=t;
          L f=gcd(fz,fm);
          fz/=f;
        fm/=f;
    }
    }
    if(fz%fm==0) cout<     else if(fz>fm) cout<     else cout<     return 0;
}
最终发现代码的问题出现在当n==1时,没有得到相应的化简,最终的数据输出没能通过测试点,还有一个问题就是,所有的数据类型应该都用L来定义,L为long long型。我自己测试时L也可以是long型,可以通过测试点,但是建议不要这样,因为本题会涉及到加法运算,当数很大时会超过长整型范围。

你可能感兴趣的:(pta)