一开始写了硬模拟,直到比完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;
}