一开始写了硬模拟,直到比完a.len*b.len/gcd(a.len,b.len)位才结束。然后果不其然被大质数T掉,然后用一种投机取巧的方法过了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
string a, b;
while (cin >> a >> b) {
ll na = a.length(), nb = b.length();
int i = 0, j = 0, k = 0, n = 500000; // max(na, nb) * 5;
while (a[i] == b[j]) {
++i, ++j, ++k;
if (i == na && j == nb) break;
if (k > n) break;
if (i == na) i = 0;
if (j == nb) j = 0;
}
if (a[i] == b[j]) puts("=");
else if (a[i] > b[j]) puts(">");
else if (a[i] < b[j]) puts("<");
}
return 0;
} 正确做法是:
无限循环并不需要一直循环,只需要让无限循环应该具有的性质体现出来即可。
让最大长度的字符串展开二倍。这样所有的细节都会在这个新的字符串中体现。然后让小的字符串一直扩增,直到长度相同。
fromLDU武远博
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
string a, b;
while (cin >> a >> b) {
int na = a.length(), nb = b.length(), f = 0;
if (na < nb) swap(a, b), swap(na, nb), f = 1;
a += a, na += na;
int t = na / nb, r = na % nb;
string bb = "";
for (int i = 0; i < t; ++i) bb += b;
bb += b.substr(0, r);
//cout << a << endl << bb << endl;
if (a < bb) {
if (!f) cout << '<' << endl;
else cout << '>' << endl;
} else if (a == bb)
cout << '=' << endl;
else if (a > bb) {
if (f) cout << '<' << endl;
else cout << '>' << endl;
}
}
return 0;
} 这是一种等效的做法,但是要注意while循环体里语句的顺序。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
string a, b;
while (cin >> a >> b) {
ll na = a.length(), nb = b.length();
int i = 0, j = 0, k = 0, n = max(na, nb) * 2;
while (a[i] == b[j]) {
if (k > n) break;
if (i == na && j == nb) break;
++i, ++j, ++k;
if (i == na) i = 0;
if (j == nb) j = 0;
}
if (a[i] == b[j])
puts("=");
else if (a[i] > b[j])
puts(">");
else if (a[i] < b[j])
puts("<");
}
return 0;
} 另一种做法更恐怖了:
#include <bits/stdc++.h>
using namespace std;
int main() {
string a, b;
while (cin >> a >> b) {
string c = a + b, d = b + a;
if (c > d) cout << ">" << endl;
else if (c < d) cout << "<" << endl;
else cout << "=" << endl;
}
return 0;
} 
京公网安备 11010502036488号