【题解】UVa 11549【Calculator Conundrum】

分析

这题使用Floyd判圈法,这里就不明说了。
重点是$C++11$,本题解请在$C++11$下愉快运行,因为$C++11$给咱们提供了伟大的to_string()函数,用于将数据类型转换成$string$,然后手写一个模拟转换成$int$的函数$parseInt()$即可,这里名字来源于$Java$。这样就避免了使用$c$风格函数和慢出天际的字符串流。

代码

#include<string>
#include<cmath>
#include<iostream>
using std::to_string;using std::string;using std::cin;using std::cout;using std::endl;
typedef long long int64;

inline int parseInt(string s){
    int ans = 0;
    for(int i = 0;i < s.length();i++) ans += (s[i] - '0') * pow(10,s.length() - i - 1);
    return ans;
}

inline int next(int n,int k){
    string s = to_string((int64)k * k);
    if(s.length() > n) s = s.substr(0,n);
    return parseInt(s);
}

int main(){
    int T;cin >> T;
    while(T--){
        int n,k;cin >> n >> k;
        int ans = k,k1 = k,k2 = k;
        do{
            k1 = next(n,k1);
            k2 = next(n,k2);if(k2 > ans) ans = k2;
            k2 = next(n,k2);if(k2 > ans) ans = k2;
        }while(k1 != k2);
        cout << ans << endl;
    }

    return 0;
}