题目如下:
题目描述
输入描述:
输入两个整数 a, b, 0 ≤ a , b < 1 0 1 0 5 0 \le a, b < 10^{10^5} 0≤a,b<10105
输出描述:
如果在每一种情况中
a
>
b
a>b
a>b, 则输出">“。
如果在每一种情况中
a
<
b
a<b
a<b, 则输出”<“。
如果在每一种情况中
a
=
b
a=b
a=b, 则输出”=“。
否则
a
!
=
b
a != b
a!=b, 则输出”!"。
示例1
输入
45 54
输出
!
前言
为什么要写这篇题解,因为我这个题赛后被 fst 了, 数据加强后这个题我就 wa 了。
少了一种情况,例如:
13 310
3->0
10 1X
10 < 1X
最后考虑上这一种情况后就 AC 了
题解:
设: 数为
a
a
a,
b
b
b;长度为
l
e
n
a
lena
lena,
l
e
n
b
lenb
lenb
请注意判断的逻辑顺序
如果
a
=
b
a = b
a=b 毫无疑问是 =
如果
l
e
n
a
=
l
e
n
b
lena = lenb
lena=lenb 是 !
我们可以构造出
<
&
>
< \& >
<&>
接下来就是长度不相同的
为了书写代码方便,我们让
l
e
n
a
>
l
e
n
b
lena > lenb
lena>lenb
bool flag = 0;
if (lena < lenb)
flag = 1, swap(lena, lenb), swap(a, b);
我们先去判断多余的部分是否可以变成 0 0 0, 也就说是否可以映射成 0 0 0
如果不可以,谁长度大谁大
char ch = a[0];
for (int i = 0; i < lena - lenb; i++)
{
if (a[i] != ch)
{
cout << (flag ? "<\n" : ">\n");
return;
}
}
如果可以凑成
0
0
0, 我们到达下一步
把多余的部分删掉,因为都是
0
0
0
a.erase(a.begin(), a.begin() + lena - lenb);
此时如果
a
=
b
a = b
a=b 那就是 !
因为有构造可以让长度大的大
if (a == b)
{
cout << "!\n";
return;
}
接下来判断是否
a
a
a,
b
b
b 可以是 >
or <
找到
a
a
a,
b
b
b 不同的地方 idx
如果
b
[
i
d
x
]
b[idx]
b[idx] 不能变成 0, 那就是 !
否则是:谁长度大谁大
for (int i = 0; i < lenb; i++)
{
if (a[i] != b[i])
{
if (b[i] != ch)
{
cout << "!\n";
return;
}
break;
}
}
cout << (flag ? "<\n" : ">\n");
AC 代码如下:
/*
Make it simple and keep self stupid
author:Joanh_Lan
*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <numeric>
#include <cstring>
#include <cmath>
#include <map>
#include <unordered_map>
#include <bitset>
#include <set>
#include <random>
#include <ctime>
#include <queue>
#include <stack>
#include <climits>
#define buff \
ios::sync_with_stdio(false); \
cin.tie(0);
// #define int long long
#define ll long long
#define PII pair<int, int>
#define px first
#define py second
typedef std::mt19937 Random_mt19937;
Random_mt19937 rnd(time(0));
using namespace std;
const int mod = 1e9 + 7;
const int inf = 2147483647;
const int N = 100009;
// int Mod(int a,int mod){return (a%mod+mod)%mod;}
// int lowbit(int x){return x&-x;}//最低位1及其后面的0构成的数值
// int qmi(int a, int k, int p){int res = 1 % p;while (k){if (k & 1) res = Mod(res * a , p);a = Mod(a * a , p);k >>= 1;}return res;}
// int inv(int a,int mod){return qmi(a,mod-2,mod);}
// int lcm(int a,int b){return a*b/__gcd(a,b);}
string a, b;
void solve()
{
cin >> a >> b;
int lena = a.size(), lenb = b.size();
if (a == b)
{
cout << "=\n";
return;
}
if (lena == lenb)
{
cout << "!\n";
return;
}
bool flag = 0;
if (lena < lenb)
flag = 1, swap(lena, lenb), swap(a, b);
char ch = a[0];
for (int i = 0; i < lena - lenb; i++)
{
if (a[i] != ch)
{
cout << (flag ? "<\n" : ">\n");
return;
}
}
a.erase(a.begin(), a.begin() + lena - lenb);
if (a == b)
{
cout << "!\n";
return;
}
for (int i = 0; i < lenb; i++)
{
if (a[i] != b[i])
{
if (b[i] != ch)
{
cout << "!\n";
return;
}
break;
}
}
cout << (flag ? "<\n" : ">\n");
}
int main()
{
buff;
int _ = 1;
// cin >> _;
while (_--)
solve();
}