zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3334858.html
Copyright © 2011-2022 走看看