Calculator Conundrun UVA 11549


题意: 一个老式计算器,只能显示n(1 <= n <= 9)位,  现给定k(0 <= k <= 1E+n),求其平方,若溢出保留前n位,问一直计算下去能得到的最大值;


分析 :

题中隐约告诉我们有循环,显然如果出现两个相同的数,这两个之间便是一个循环

而一个计算器能显示的数是有限的,所以必然会出现相同的数

#include <iostream>
#include <cstdio>

using namespace std;

int next(int n, int k)
{
    if(!k) return 0;
    long long sum = (long long)k * (long long)k;
    int len = 0;
    int a[100];
    while(sum > 0)
    {
        a[len++] = sum % 10;
        sum /= 10;
    }
    if(n > len) n = len;
    int ans = 0;
    for(int i = 0; i < n; i++)
        ans = ans * 10 + a[--len];
    return ans;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n, k;
        scanf("%d%d", &n, &k);
        int k1 = k, k2 = k;
        int ans = k;
        do
        {
            k1 = next(n, k1);
            ans = max(ans, k1);
            k2 = next(n, k2);
            ans = max(ans, k2);
            k2 = next(n, k2);
            ans = max(ans, k2);
        }
        while(k1 != k2);
        printf("%d\n", ans);
    }
    return 0;
}
这里用到的是Floyd判圈算法

k1每次走一步,k2每次走两步,若有环,走的快的一定会追上走的慢的

首先从上面分析知道,最小环上不可能有相同点,

在环上跑时,不管k1,k2,位置如何,k2总是相对于k1以一步每次的速度追赶k1,所以k2一定会追上k1;




猜你喜欢

转载自blog.csdn.net/ecjtusanhu/article/details/61208577
今日推荐