• Uva 11549


    题目链接: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 }
    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
    ",ans);
    46     }
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    sql except 用法,找两个表中非共同拥有的
    ‘堆’出你的洪荒之力
    原来你是个这样的JVM
    变形词
    54题
    最大对称子数组
    java 线程之间通信以及notify与notifyAll区别。
    大型网站架构系列:消息队列
    剑指offer第10题
    & 和 && 区别
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3334858.html
Copyright © 2020-2023  润新知