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判圈算法)的主要内容,如果未能解决你的问题,请参考以下文章
[2016-03-19][UVA][11549][Calculator Conundrum]