题意:给定一个数k,每次计算k的平方,然后截取最高的n位,然后不断重复这两个步骤,问这样可以得到的最大的数是多少?
Floyd判圈算法:这个算法用在循环问题中,例如这个题目中,在不断重复中,一定有一个不断重复的过程,就是说出现的数字一定有一个周期,
这就是一个典型的循环问题。Floyd判圈算法的思想就是,例如两个小孩在一个圆形的操场上跑步,两个人以恒定的速度从同一个点出发,然后一个小孩跑步的
速度比另一个小孩的速度要快,很显然,一定的时间后,快一点的小孩一定会追赶一个循环之后追上跑的慢的那个小孩。当两个小孩第二次相遇后,可以确定的是
已经经过了一个周期,而且在两个周期之内。根据这个原理就可以用来判断循环了。下面附上UVA 11549 - Calculator Conundrum的解题代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<deque> 6 using namespace std; 7 typedef long long INT; 8 9 INT cut(int n,INT k) 10 { 11 k *= k; 12 deque<INT> que; 13 while(k) 14 { 15 que.push_front(k % 10); 16 k /= 10; 17 } 18 k = 0; 19 for(int i = 0;i < n && !que.empty();++i) //考虑实际长度小于n的情况 20 { 21 k = 10 * k + (*que.begin()); 22 que.pop_front(); 23 } 24 return k; 25 } 26 27 int main() 28 { 29 int T,n; 30 INT k; 31 scanf("%d",&T); 32 while(T--) 33 { 34 scanf("%d%lld",&n,&k); 35 INT K = k; 36 INT ans = k; 37 do 38 { 39 k = cut(n,k); 40 ans = max(ans,k); 41 K = cut(n,K); 42 ans = max(ans,K); 43 K = cut(n,K); 44 ans = max(ans,K); 45 }while(k != K); 46 printf("%lld\n",ans); 47 } 48 return 0; 49 }
(唉,三个月没写博客了)