传送门: https://ac.nowcoder.com/acm/contest/881/J

题目描述

Bobo has two fractions x/a and y/b. He wants to compare them. Find the result.

输入描述

The input consists of several test cases and is terminated by end-of-file.

Each test case contains four integers x, a, y, b.

  • 图片说明 x , y 图片说明 图片说明

  • 图片说明 图片说明 a , b 图片说明 图片说明

  • There are at most 图片说明 test cases

输出描述

For each test case, print ' = ' if x/a = y/b.
Print ' < ' if x/a < y/b.
Print ' > ' otherwise.

输入

1 2 1 1
1 1 1 2
1 1 1 1

输出

<
>
=

这道题原本就是道签到题,我上来想的就比较少,直接暴力搞,无奈数据太大,long long也存不下,long double也试过了。大概瞎搞了一个多小时,Wa了6发,看这榜上一个个都过了,有点难受。后来换了一个思路,突然灵机一动就想到了:先除取整 整数部分大就输出 > ,小就输出 <, 相等的话再取余 ,比较交叉相乘余数部分 。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long x,a,y,b;
    long long n,m;
    long long k,t;
    while(scanf("%lld%lld%lld%lld",&x,&a,&y,&b)!=EOF)
    {
        n = x/a;
        m = y/b;
        if(n<m)
            cout<<"<"<<endl;
        else if(n>m)
            cout<<">"<<endl;
        else
        {
            k=x%a;
            t=y%b;

            if(k*b==t*a)
            cout<<"="<<endl;
            else if(k*b>t*a)
            cout<<">"<<endl;
            else
            cout<<"<"<<endl;

        }

    }
    return 0;
}

赛后看了Rank的代码,发现有的是用 __int128写的,之前也没听过,感觉就是比long long再大一点的数据类型,上网上搜了一下,说是只能在Linux环境下使用 __int128,而且 __int128没有办法使用cin、cout来进行输入输出。所以输入输出需要自己写,但它确实也能储存1e35的数字。但这道题输入最多long long型,而输出只需要输出字符,同时 __int128支持比较,有些OJ平台貌似不支持 __int128,牛客应该支持,所以也可以这么写…

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

int main()
{
    int a,b;
    LL x,y;
    while(scanf("%lld%d%lld%d",&x,&a,&y,&b)==4){
        __int128 l = (__int128)x * b;
        __int128 r = (__int128)y * a;
        if(l>r){
            printf(">");
        }
        else if(l<r){
            printf("<");
        }
        else{
            printf("=");
        }
        printf("\n");
    }
    return 0;
}

有关__int128的具体使用方法可以参考
https://blog.csdn.net/shadandeajian/article/details/81843805