Uva 11549 Calculator Conundrum

题意:有一个老式计算器,只能显示n为数字。有一天,你无聊了,于是输入一个整数k,然后反复平方,直到溢出。每次溢出时,计算器会显示出结果最高的

n位和一个错误标记。然后清除错误标记,继续平方。如果一直这样做下去,能得到的最大数是多少。

题解:简单的推一下,发现其前几位是一个环状结构,及计算器显示出的数将出现循环,应为不管怎么样,数总会出现重复。

这样方法一可以不断模拟,吧结果存入数组中不断找,map去做应该是可以的。

但是这里讲一个的算法,即floyd判圈算法,可以大幅降低空间复杂度O(1),其运行时间也下降不少。

可以想象一下,在一个圆形操场上跑,一个孩子跑得比另一个孩子快,那么总会有那么一个时刻会追上,二结果就是记录每次的值即可。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<string>
#include<cstring>

using namespace std;

int t,n;
long long k1,k2,ans;

long long max(long long a,long long b)
{
    return a>b?a:b;
}
long long next(long long x,int k)
{
    x=(long long)x*x;
    long long xx=x,num=0;
    while (xx!=0)
    {
        xx/=10;
        num++;
    }
    for (int i=1;i<=num-k;i++)
    {
        x/=10;
    }
    ans=max(ans,x);
    return x;
}
int main()
{
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%lld",&n,&k1);
        k2=k1,ans=k1;
        do
        {
            k1=next(k1,n);
            k2=next(k2,n);
            k2=next(k2,n);
        }while(k2!=k1);
        printf("%lld
",ans);
    }
}
原文地址:https://www.cnblogs.com/fengzhiyuan/p/6985284.html