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;
}
我当时没有定义函数了,其实定义函数可能更好。