Uva 11549 - Calculator Conundrum 找规律加map

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2544解题报告:小明有一个老式计算器,这个计算器只能显示n位数,现在小明输入一个数k,并且将这个数k一直做平方运算,当得到的结果大于n位的时候 ,这个计算器会自动取最高的n位,问这样一直进行下去能得到的最大的数是多少?

很显然,屏幕上显示的数会有一个周期,例如,当输入1 6 的时候,屏幕上显示的数依次是 6,3,9,8,6,3,9,8,6.......所以,我们在一个周期里面找最大的就可以了。

 1 // File Name: Uva11549-Calculator-Conundrum.cpp
 2 // Author: sheng
 3 // Created Time: 2013年09月23日 星期一 14时08分59秒
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<map>
 7 #include<iostream>
 8 #include<cmath>
 9 using namespace std;
10 
11 typedef long long INT;
12 
13 INT change(INT k,INT n)
14 {
15     k *= k;
16     INT d = 0;
17     INT x = k;
18     while(x)
19     {
20         x /= 10;
21         d++;
22     }
23     if(d <= n)
24     return k;
25     x = d - n;
26     while(x--)
27     k /= 10;
28     return k;
29 }
30 
31 
32 int main()
33 {
34     INT T,n,k;
35     scanf("%lld",&T);
36     while(T--)
37     { 
38         scanf("%lld %lld",&n,&k);
39         map<INT,int> map1;
40         pair<map<INT,int>::iterator,bool>  iter;
41         INT ans = -0x3ffffff;
42         for(int i = 1;;++i)
43         {
44             ans = max(ans,k);
45             iter = map1.insert(pair<INT,int> (k,i));
46             if(iter.second == 0)
47             break;
48             k = change(k,n);  //将k平方,并且取最高的n位。
49         }
50         printf("%lld\n",ans);
51     }
52     return 0;
53 }
View Code

 另外再附上一种速度更快的方法,Flyod判圈法,利用这种方法判断周期,在Uva上运行时间几乎只用了上一种方法的一半。很神奇的判圈法,可以去了解一下。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<map>
 4 #include<iostream>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 typedef long long INT;
 9 
10 INT change(INT k,INT n)
11 {
12     k *= k;
13     INT d = 0;
14     INT x = k;
15     while(x)
16     {
17         x /= 10;
18         d++;
19     }
20     if(d <= n)
21     return k;
22     x = d - n;
23     while(x--)
24     k /= 10;
25     return k;
26 }
27 //Floyd判圈法
28 
29 int main()
30 {
31     int T,n,k;
32     scanf("%d",&T);
33     while(T--)
34     {
35         scanf("%d%d",&n,&k);
36         int k1 = k,k2 = k,ans = k;
37         do
38         {
39             k1 = change(k1,n);
40             k2 = change(k2,n); 
41             ans = max(ans,k2);
42             k2 = change(k2,n);
43             ans = max(ans,k2);
44         }while(k1 != k2);          //代码更短,速度更快
45         printf("%d\n",ans);
46     }
47     return 0;
48 }
View Code

 

posted @ 2013-09-23 14:55  xiaxiaosheng  阅读(263)  评论(0编辑  收藏  举报