高精度分式比较大小
Description
已知两个分数 a/x与 b/y,让你判断两个分数的大小。
Input
多组输入,对于每一组输入一行包含四整数 x,a,y,b至少有 10^5 组数据
Output
对于每一组输入,输出一行,包含一个字符
如果 a / x = b / y a/x= b/y a/x=b/y,则输出"="
如果 a / x > b / y a/x> b/y a/x>b/y,则输出">"
否则输出"<"
Sample Input 1
1 2 1 1
1 1 1 2
1 1 1 1
Sample Output 1
<
=
Hint
此题难度较大,注意double精度
0≤x,y≤10^18
1≤a,b≤10^9
解释:
首先要明白两个整型变量相除结果会舍去小数,double参与除法运算会出现精度丢失现象鉴于本题较大的数据范围,所以本题求解不适合用double类型变量直接参与运算——double精度为15-16位指数位。([double精度详解]https://blog.csdn.net/black_kyatu/article/details/79257346)
其次是要知道分式可以转化为几右几分之几的形式,例如
5
/
2
5/2
5/2 = 2
1
/
2
1/2
1/2,
7
/
2
7/2
7/2 = 3
1
/
2
1/2
1/2
其中2 = 5/2, 3 = 7/2
本题让比较
x
/
a
和
y
/
b
x/a和y/b
x/a和y/b的大小,可通过上述转换得到$x/a
=
(
= (
=(x/a$) (x%a)/a 或者
x/a = (x/a) (x-a*(x/a))/a,同理y/b也可以写成此种形式。
比较方法如果x/a > y/b 则 output: >
如果x/a < y/b 则 output: <
如果x/a = y/b 则通过交叉相乘法比较(x%a)/a 与 (y%b)/b。
#include<stdio.h>
int main(){
long long x, a, y, b;
while(scanf("%lld%lld%lld%lld", &x, &a, &y, &b) != EOF)
{
long long c1 = x / a, c2 = y / b;
long long multi1 = (x % a) * b, multi2 = (y % b) * a;
if(c1 > c2) printf(">\n");
else if(c1 < c2) printf("<\n");
else{
if(multi1 == multi2) printf("=\n");
else if( multi1 > multi2 ) printf(">\n");
else printf("<\n");
}
}
return 0;
}