题目描述
给出两个分数,求他们的和,化简为最简式。
输入描述:
第1行输入一个整数T,表示有T组测试数据。
第2-T+1行,每行输入4个正整数a,b,c,d,表示两个分数a/b和c/d。
数据保证:0<T≤1000,0<a,b,c,d≤1000。
输出描述:
对于每组测试数据,输出两个整数e和f,表示a/b + c/d的最简化结果是e/f,每组输出占一行。
示例1
输入
复制
2
1 2 1 3
4 3 2 3
输出
复制
5 6
2 1
题解:
首先我们可以先化简公式,a/b+c/d=(ad+bc)/(bd),也就是题目所说的e=ad+bc,f=bd;
但是题目说了要化成最简,所以我们要求出目前e和f的最小公倍数,然后e和f分别除最大公约数所得的就是答案。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cctype>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
#define ll long long
#define LL unsigned long long
int dx[4]= {0,1,0,-1},dy[4]= {1,0,-1,0};
int read()
{
int ans=0,sign=1;
char ch;
ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
sign=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
ans=(ans<<1)+(ans<<3)+(ch^48);
ch=getchar();
}
return sign*ans;
}
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
/*inline double f(double x)//原函数
{
double c,d,a,b,L,R;
return (c*x+d)/(a*x+b);
}
inline double simpson(double l,double r)//辛普森公式
{
double c,d,a,b,L,R;
double mid=(l+r)/2;
return (r-l)*(f(l)+f(r)+4*f(mid))/6.0;
}
double ask(double l,double r,double eps,double V)//自适应精度调节
{
//该函数的意思是,不断二分区间,使得该区间的辛普森积分(V)与二分后所得的辛普森基分和的值的差小于等于精度;
//上面句子的意思,可以简单换成,左区间的辛普森值+右区间的辛普森值==该整个区间的辛普森值得和
double mid=(l+r)/2;
double VL=simpson(l,mid),VR=simpson(mid,r);
if(abs(VL+VR-V)<=eps)
return VL+VR;
else
return ask(l,mid,eps/2,VL)+ask(mid,r,eps/2,VR);//因为区间不断二分,所以精度也要变高。
}*/
ll quickpower(ll x,ll y)
{
ll ans=1,cnt=x;
while(y)
{
if(y&1)
{
ans*=cnt;
}
cnt*=cnt;
y>>=1;
}
return ans;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int e=a*d+b*c;
int f=b*d;
int g=gcd(e,f);
e=e/g;
f=f/g;
cout<<e<<" "<<f<<'\n';
}
return 0;
}
京公网安备 11010502036488号