UVa 11549 - Calculator Conundrum(Floyd判圈法)

现在输入一个整数 k ,每次取前 n 位,反复平方,一直下去,输出能得到的最大数。每次取前 n 位所以一定会出现循环,使用Floyd判圈法判断是否出现重复。输出循环中的最大值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<cstdio>
#include<algorithm>
typedef long long LL;
using namespace std;
int buf[100];
int Next(int n,int k){
if(!k) return 0;
LL k2=LL(k)*k;
int l=0;
while(k2>0){
buf[l++]=k2%10;
k2/=10;
}
n=min(n,l);
int ans=0;
for(int i=0;i<n;++i)
ans=ans*10+buf[--l];
return ans;
}
int main(){
int t;scanf("%d",&t);
while(t--){
int n,k;scanf("%d%d",&n,&k);
int ans=k,k1=k,k2=k;
do{
k1=Next(n,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;
}

** 本文迁移自我的CSDN博客,格式可能有所偏差。 **