Floyd判圈算法 UVA 11549 - Calculator Conundrum

题意:给定一个数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 }
View Code

(唉,三个月没写博客了)

posted @ 2014-01-21 21:54  xiaxiaosheng  阅读(336)  评论(0编辑  收藏  举报