HDU.2503 a/b + c/d (分式化简)

a/b + c/d

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12746 Accepted Submission(s): 6774

Problem Description

给你2个分数,求他们的和,并要求和为最简形式。

Input

输入首先包含一个正整数T(T<=1000),表示有T组测试数据,然后是T行数据,每行包含四个正整数a,b,c,d(0

Output

对于每组测试数据,输出两个整数e和f,表示a/b + c/d的最简化结果是e/f,每组输出占一行。

Sample Input

2
1 2 1 3
4 3 2 3

Sample Output

5 6
2 1

解题思路:

模拟一下分式化简过程就行,先通分,再相加,然后能约分约分。
值得注意的2个地方:
1.gcd函数的写法
2.特殊情况的处理

代码:

/*
    Title:HDU.2503
    Date:2016-10-24
    Author:pengwill
    Blog:http://blog.csdn.net/pengwill97/
*/
#include <stdio.h>
#include <stdlib.h>

int find(int a,int b);
int main()
{
    int T;
    int a, b, c,d,lcm,n;
    scanf("%d" ,&T);
    while(T--){
        scanf("%d%d%d%d",&a,&b,&c,&d);
        lcm = b * d / find(b,d);
        n = a * lcm / b + c * lcm / d;
        int judge = find(lcm,n);
        if(judge == 1){
            printf("%d %d\n",n,lcm);
        }else{
            printf("%d %d\n",n / judge, lcm /judge);
        }

    }
    return 0;
}
int find(int a,int b)
{
    int t;
    if(a<b){
        t = a;
        a = b;
        b = t;
    }
    while(b && b!= 1){
        t = a %b;
        a = b;
        b = t;
    }
    if(b == 1){
        return b;
    }else{
        return a;
    }

}
posted @ 2016-10-24 11:42  pengwill  阅读(131)  评论(0编辑  收藏  举报