UVa 11549 计算器谜题(Floyd判圈算法)

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 11549 计算器谜题(Floyd判圈算法)相关的知识,希望对你有一定的参考价值。

https://vjudge.net/problem/UVA-11549

题意:

有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位。如果一直这样做下去,能得到的最大数是多少?

 

思路:

这个肯定是会循环的。

比较普通的做法就是用set来判断是否出现过来终止循环。

另一个高效算法:Floyd判圈算法!!

想象一下,假设有两个小孩子在一个“可以无限向前跑”的跑道上赛跑,同时出发,但其中一个孩子的速度是另一个两倍。如果跑到是直的,跑得快的小孩永远在前面,但如果跑道有环,则跑得快的小孩将“追上”跑得慢的小孩。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 using namespace std;
11 
12 int n,k;
13 
14 int next(int n,int k)
15 {
16     int buf[105];
17     if(!k)  return 0;
18     int cnt=0;
19     long long k2=(long long)k*k;
20     while(k2)   {buf[cnt++]=k2%10;k2/=10;}
21     if(n>cnt)   n=cnt;
22     int ans=0;
23     for(int i=0;i<n;i++)
24         ans=ans*10+buf[--cnt];
25     return ans;
26 }
27 
28 int main()
29 {
30     //freopen("D:\\input.txt","r",stdin);
31     int T;
32     scanf("%d",&T);
33     while(T--)
34     {
35         scanf("%d%d",&n,&k);
36         int ans=k;
37         int k1=k,k2=k;
38         do
39         {
40             k1=next(n,k1);  ans=max(ans,k1);
41             k2=next(n,k2);  ans=max(ans,k2);   //小孩2,第一步
42             k2=next(n,k2);  ans=max(ans,k2);   //小孩2,第二步
43         }while(k1!=k2);  //追上以后才停止
44         printf("%d\n",ans);
45     }
46     return 0;
47 }

 

以上是关于UVa 11549 计算器谜题(Floyd判圈算法)的主要内容,如果未能解决你的问题,请参考以下文章

Floyd判圈算法

[2016-03-19][UVA][11549][Calculator Conundrum]

[UVa 11549]Calculator Conundrum

Floyd 判圈算法

Floyd判圈算法

Floyd判圈算法 Floyd Cycle Detection Algorithm