算法竞赛入门经典训练指南 例题1-19 计算器谜题 Calculator Conundrum uva11549

来源:互联网 发布:杭州莱茵矩阵国际 编辑:程序博客网 时间:2024/06/12 05:06

题目:https://vjudge.net/problem/UVA-11549

思路:利用Floyd判圈法退出周期。
Floyd判圈法(很像快慢指针的思路)——一个人速度是另一个人的两倍,那么如果道路是直的,则两人始终不相遇;如果道路上有环,那么跑的快的一定会追上跑的慢的(也就是套圈)。
注意只有跑的快的经历了周期中的所有情况。

代码:c++

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;long long cut(long long a, int n){    char s[110] = { 0 };    sprintf(s, "%lld", a);    s[n] = '\0';    long long ans;    sscanf(s, "%lld", &ans);    return ans;}int main(){    int T;    cin >> T;    while (T--)    {        int n;        long long k;        scanf("%d%lld", &n, &k);        long long slow = k, fast = k;        long long ans = k;        do        {            slow = cut(slow * slow, n);            fast = cut(fast * fast, n);            ans = max(ans, fast);            fast = cut(fast * fast, n);            ans = max(ans, fast);        } while (slow != fast);        printf("%lld\n", ans);    }    return 0;}
原创粉丝点击