XTU,C语言,分数加减法

该博客讨论了一道关于计算和简化分数的问题。作者首先描述了题目要求,即计算两个分数的和与差,并确保结果是最简分数形式。作者在初始尝试中使用了循环求最大公因数的方法导致超时,随后改用更高效的欧几里得算法求解,成功避免了超时问题。代码示例展示了如何实现这一算法,包括处理整数和分数两种情况。
摘要由CSDN通过智能技术生成

Description

给你两个分数,请计算两者和及差。 输入 第一行是一个整数K,表示样例的个数。以后每行一个样例,每行4个正整数,a、b、c、d,即计算分数a/b与c/d的和、差。4个整数都不超过10,000。 输出 每行输出一个样例的结果,先输出和,后输出差。如果结果的值为整数,那么只需要输出整数,如果结果的值为分数,需要输出x/y的形式,并保证x,y互质。

Sample Input

3
1 2 1 2
2 3 1 3
1 8 5 8

Sample Output

1 0
1 1/3
3/4 -1/2

这道题关键在于需要输出x/y的形式,并保证x,y互质。这个我们可以通过先求出分子分母的最大公因数,然后分子分母同除以最大公因数来得到。

这道题我第一次做的时候超时了,当时我定义了一个求最大公因数的函数,但是利用循环结构求公因数,这个容易超时。代码如下:

int cf(int x,int y0)
{
    int i,j;
    for(i = 2;i <= fabs(x)&&i <= fabs(y0);i++)
        {
          if(x%i==0&&y0%i==0)
          j = i;
        }
       return j;
}

后来我采用了另外一种方法求最大公因数,所有代码如下:

#include <stdio.h>
#include<math.h>
int main()
{
    int k,a,b,c,d;
    scanf("%d",&k);
    while(k--)
    {
        scanf("%d %d %d %d",&a,&b,&c,&d);
        int m,n,t,x1,x2,y,z = 1;//x1为和的分子,x1为差的分子
        x1 = (a*d + b*c),x2 = (a*d - b*c),y = (b*d);//y为分母
        if((x1)%(y)==0)
        {
            printf("%d ",x1/y);
        }
        else
        {
            m = x1;
            n = y;
           while(n != 0)
           {
               t = m % n;
               m = n;
               n = t;
           }
           printf("%d/%d ",x1/m,y/m);//m为公因数
        }
        y = b*d;
        if(x2<0)//作差时有小于零的情况
        {
             z = -1;
            x2 = -x2;
        }
        if((x2)%(y)==0)
        {
            printf("%d\n", z*x2 / y);
        }
        else
        {
            m = x2;
            n = y;
           while(n != 0)
           {
               t = m % n;
               m = n;
               n = t;
           }
           printf("%d/%d\n",z*x2/m,y/m);
        }
    }
    return 0;
}

我当时没有定义函数了,其实定义函数可能更好。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值