码迷,mamicode.com
首页 > 其他好文 > 详细

L1-009. N个数求和

时间:2016-05-16 00:14:27      阅读:587      评论: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

第二部分:思路

分数加法简单,不予解释。这里需要注意几点:

1,答案错误:整数部分和分数部分一定是同号的,即同正同负。比如:2/3 -7/3,结果应该是-1 -2/3。一开始没注意到这点,输出的会是-2 1/3.

输出:整数为0看分数,如果分数也为0那么输出0.

2,浮点错误:这里多半是因为长度超出,这里需要在每次求和后就把分数部分变成最简形式,就是分子小于分母,且它们没有公因子。

第三部分:代码

#include<stdio.h>
#include<stdlib.h>
long long fun(long long m,long long n)
{
    //求最大公约数 
    long long r=n%m;
    while(r!=0)
    {
        n=m;
        m=r;
        r=n%m;
    }
    return m;
}
int main()
{
    int n;
    scanf("%d",&n);
    long long x,y,sum=0;
    int i;
    for(i=0;i<n;i++)
    {
        long long a,b;
        char ch;
        scanf("%lld%c%lld",&a,&ch,&b);
        sum+=a/b;
        a%=b;    
        if(i==0)
        {
            x=a;
            y=b;
        }
        else
        {
            sum+=(a*y+x*b)/(y*b);
            x=(a*y+x*b)%(y*b);    
            y*=b;
        }
        if(sum*x<0)
        {
            if(sum>0)
            {
                sum--;
                x+=y; 
            }
            else
            {
                sum++;
                x-=y; 
            }
        }
        if(x!=0&&y!=0)
        {
            long long t=x;
            if(t<0)
            {
                t*=-1;
            }
            t=fun(t,y);
            x/=t;
            y/=t;
        }
    }
    if(sum!=0)
    {
        printf("%lld",sum);
        if(x!=0&&y!=0)
        {
            printf(" %lld/%lld\n",x,y);
        }
    }
    else
    {
        if(x!=0&&y!=0)
        {
            printf("%lld/%lld\n",x,y);
        }
        else
        {
            printf("%d\n",0);
        }
    }
    return 0;
}

 

L1-009. N个数求和

标签:

原文地址:http://www.cnblogs.com/xiangguoguo/p/5496651.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!