题目描述
给你两个分数,请计算两者和及差。
输入格式
第一行是一个整数K,表示样例的个数。以后每行一个样例,每行4个正整数,a、b、c、d,即计算分数a/b与c/d的和、差。4个整数都不超过10,000。
输出格式
每行输出一个样例的结果,先输出和,后输出差。如果结果的值为整数,那么只需要输出整数,如果结果的值为分数,需要输出x/y的形式,并保证x,y互质。
输入样例
3
1 2 1 2
2 3 1 3
1 8 5 8
输出样例
1 0
1 1/3
3/4 -1/2
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int n,k,l;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int fz1,fm1,fz2,fm2,x,y,f;
scanf("%d %d %d %d",&fz1,&fm1,&fz2,&fm2);
if(fm1==fm2)//分子分母情况不同的运算过程(不理解尽量在草稿纸手算一遍)
{
y=fm1;
x=fz1+fz2;
f=fz1-fz2;
}
else
{
y=fm1*fm2;
x=fz1*fm2+fz2*fm1;
f=fz1*fm2-fz2*fm1;
}
if(x==y&&f==0)
{
printf("1 0\n");
}
else if(x==y&&f!=0)
{
printf("1 ");
printf("%d/%d\n",f,y);
}
else if(f==0)
{
k=__gcd(x,y);//求最大公约数
l=abs(__gcd(f,y));//最大公约数绝对值,避免负号在分母上。
int temp=y;
x/=k;//分子分母互质
y/=k;//分子分母互质
printf("%d/%d ",x,y);
printf("0\n");
}
else
{
k=__gcd(x,y);//求最大公约数
l=abs(__gcd(f,y));//最大公约数绝对值,避免负号在分母上。
int temp=y;
x/=k;//分子分母互质
y/=k;//分子分母互质
printf("%d/%d ",x,y);
f/=l;//分子分母互质
temp/=l;//分子分母互质
printf("%d/%d\n",f,temp);
}
}
}