UVa 11549 Calculator Conundrum
题目大意:
给一个长度为n位的计算器,初始数是k,不断对其进行平方.若溢出,只保留前n位(从最高位开始),求得到的最大数是多少.
题目分析:
将数反复平方,肯定会出现相同数,那么出现相同数时就可以停止,问题在于如何判断是否形成环.可以选择使用set或者hash判断,但是空间规模比较大,那么可以选择采用Floyd判环算法.试想,两个人绕着操场跑步,A速度为1,B速度为2,若不存在环,AB不会相遇;若存在环,当A,B相遇时B恰巧比A多跑1圈,此时也就可以停止循环.
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int buf[50];
int go(int n,int k)//k平方之后的数
{
if(k==0) return 0;
ll k2=(ll)k*k;
int L=0;
while(k2>0) buf[++L]=k2%10,k2/=10;
int ret=0;
for(int i=L;i>L-n;i--) ret=ret*10+buf[i];
return ret;
}
int main()
{
int T;
scanf("%d",&T);
while(T--) {
int n,k;
scanf("%d%d",&n,&k);
int k1=k,k2=k,ans=k;
do {//Floyd判环,可以理解为k1速度为1,k2速度为2,那么当k1==k2的时候存在环,k2恰巧比k1多跑一圈
k1=go(n,k1);
k2=go(n,k2);ans=max(ans,k2);
k2=go(n,k2);ans=max(ans,k2);
}while(k1!=k2);
printf("%d\n",ans);
}
return 0;
}