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\n",ans);
    }
}

 

转载于:https://www.cnblogs.com/fengzhiyuan/p/6985284.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值