题目链接: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 ",ans); 51 } 52 return 0; 53 }
另外再附上一种速度更快的方法,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 ",ans); 46 } 47 return 0; 48 }