本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2022-08-19 12:39:37
题外话
感觉这道题有点降智(应该只是对我来说),就写一篇题解记录一下。
做法
我们可以这样理解:分母乘上一个数 $x$ ,就代表这个分数除以 $x$;分子乘上一个数 $x$,就代表这个分数乘 $x$。
我们先假设:
$\frac{a \cdot x}{b \cdot y} = \frac{c}{d}$
转化为:
$\frac{a}{b} \cdot \frac{x}{y} = \frac{c}{d}$
然后计算得出:
$\frac{x}{y} = \frac{c}{d} \cdot \frac{b}{a}$
这样我们就知道了,$\frac{a}{b}$ 分子和分母各乘上多少,才能与 $\frac{c}{d}$ 相等。
如果 $x = 1$,那么分子不需要作乘法,否则分子需要进行一次乘法。
同理,如果 $y=1$,那么分母不需要作乘法,否则分母需要进行一次乘法。
这样就结束了吗?没有。
分子可能为 $0$。
如果两个分数的分子中有一个为 $0$,那么只需要将另一个分数的分子乘上 $0$,就行了。
如果两个分数的分子都为 $0$,那么不需要处理。
Code
#include <bits\/stdc++.h>
using namespace std;
namespace Main
{
typedef long long ll;
int t;
ll gcd(ll a,ll b)
{
return !b?a:gcd(b,a%b);
}
ll lcm(ll a,ll b)
{
return a\/gcd(a,b)*b;
}
void main()
{
scanf("%d",&t);
while(t--)
{
ll a,b,c,d;
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
if(a==0&&c!=0)
{
printf("1\n");
continue;
}
else if(a!=0&&c==0)
{
printf("1\n");
continue;
}
if(a==0&&c==0)
{
printf("0\n");
continue;
}
a*=d;
b*=c;
ll _gcd=gcd(a,b);
a\/=_gcd;
b\/=_gcd;
int ans=0;
if(b>1)ans++;
if(a>1)ans++;
printf("%d\n",ans);
}
}
}
int main()
{
Main::main();
return 0;
}

鲁ICP备2025150228号