分式比较大小——高精度

高精度分式比较大小

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/ay/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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值