题意:有一个老式计算器,只能显示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); } }