【题目】

Problem C

CALCULATOR CONUNDRUM

Alice got a hold of an old calculator that can displayndigits. She was bored enough to come up with the following time waster.

She enters a numberkthen repeatedly squares it until the result overflows. When the result overflows, only thenmostsignificant digits are displayed on the screen and an error flag appears. Alice can clear the error and continue squaring the displayed number. She got bored by this soon enough, but wondered:

“Givennandk, what is the largest number I can get by wasting time in this manner?”

Program Input

The first line of the input contains an integert(1 ≤t≤ 200), the number of test cases. Each test case contains two integersn(1 ≤n≤ 9) andk(0 ≤k< 10n) wherenis the number of digits this calculator can displaykis the starting number.

Program Output

For each test case, print the maximum number that Alice can get by repeatedly squaring the starting number as described.

Sample Input & Output

INPUT

2
1 6
2 99

OUTPUT

9
99

Calgary Collegiate Programming Contest 2008

【分析】

【思路一】

题目已经暗示计算器显示会的数字出现循环,所以不妨一个一个的模拟,每次判断新得到的数字是否以前出现过。如何判断呢?一种方法

就是把所有计算出的数字放在数组中,然后一个一个的比较。这种方法每次判断需要花费很长时间,相当慢,能否开一个数组visited,直接读取visited[k]

来判断整数k是否出现过,k(0 <= k < 10^9)的范围很大,需要开辟的空间很大,严重浪费资源。在这种情况下我们可以利用STL的集合set。

【思路二】

这个方法还是不够快的,第二种方法是用神奇的Floyd判圈算法。

假设两个小孩在一个可以无限向前跑的跑道上赛跑,同时出发,但其中一个小孩的速度是另一个小孩速度的两倍。如果跑道是直的,跑得快的小孩永远在前面,另一个小孩

永远都追不上。但如果跑道有环,则跑的快的小孩将”追上“跑的慢的小孩。

【代码】

/*********************************
*   日期:2014-5-2
*   作者:SJF0115
*   题号: 11549 - Calculator Conundrum
*   地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=show_problem&problem=2544
*   来源:UVA
*   结果:Accepted
*   总结:
**********************************/
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;int bits[10];
//截取k平方的高n位
int HighNBits(int n,int k){if(!k){return 0;}long long s = (long long)k * k;int index = 0;//分离s的各位while(s > 0){bits[index++] = s % 10;s /= 10;}//不够n位if(n > index){n = index;}//高n位int result = 0;for(int i = 0;i < n;i++){result = result * 10 + bits[--index];}return result;
}int main(){int T,i,j,n,k;scanf("%d",&T);//T组测试数据while(T--){scanf("%d %d",&n,&k);set<int> visited;int max = 0;//判断新得到的数值以前是否出现过while(visited.count(k) == 0){visited.insert(k);//更新最大值if(max < k){max = k;}k = HighNBits(n,k);}printf("%d\n",max);}return 0;
}

【代码2】

/*********************************
*   日期:2014-5-2
*   作者:SJF0115
*   题号: 11549 - Calculator Conundrum
*   地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=show_problem&problem=2544
*   来源:UVA
*   结果:Accepted
*   总结:
**********************************/
#include <iostream>
#include <stdio.h>
using namespace std;int bits[10];
//截取k平方的高n位
int HighNBits(int n,int k){if(!k){return 0;}long long s = (long long)k * k;int index = 0;//分离s的各位while(s > 0){bits[index++] = s % 10;s /= 10;}//不够n位if(n > index){n = index;}//高n位int result = 0;for(int i = 0;i < n;i++){result = result * 10 + bits[--index];}return result;
}int main(){int T,i,j,n,k;scanf("%d",&T);//T组测试数据while(T--){scanf("%d %d",&n,&k);int max = k;int k1 = k,k2 = k;do{//小孩1k1 = HighNBits(n,k1);//小孩2 第一步k2 = HighNBits(n,k2);if(k2 > max){max = k2;}//小孩2 第二步k2 = HighNBits(n,k2);if(k2 > max){max = k2;}}while(k1 != k2);//快的小孩追上慢的小孩停止printf("%d\n",max);}return 0;
}

UVA之11549 - Calculator Conundrum相关推荐

  1. UVA 11549 Calculator Conundrum

    原文请訪问我的博客:http://xiaoshig.sinaapp.com/?p=115 Alice got a hold of an old calculator that can display  ...

  2. UVa 11549 Calculator Conundrum

    大白书里面的题感觉就是没有什么固定的思路,只能认真理解学习汝佳大大的代码. 这里用的Floyd判圈法,就像插图里面的一样,两个小孩,一个快一个慢,如果实在一个环形跑道,那么快的那个最终一定会" ...

  3. UVA 11549 Calculator Conundrum

    很容看出来,一直平方又只取前面n位会构成循环,所以可以模拟,判重的话就用hash #include <iostream> #include <cstdio> #include ...

  4. UVa 11549 Calculator Conundrum (训练指南,Floyd 判圈算法)

    算法竞赛训练指南, 42 页 注意: 1. 用数组来记录一个数的各位的数字 2. 快慢指针来记录链表环的入点(Floyd 判圈算法) #include <cstdio> #include ...

  5. UVA 11549 Calculator Conundrum 题解

    题解: 题目暗示了计算机显示出的数将出现循环,最直接的方式是一个一个的模拟,并判断新得到的数字是否出现过.最简单的方式是通过数组记录已经出现过的数字,然而题目中 0<=k<=10^9 范围 ...

  6. UVa 11549 - Calculator Conundrum

    題目:計算k^2^m中,前n位構成的最大數字. 分析:數論,循環.找尋環節不斷的計算k^2^m和k^4^m相等時即為循環節. 說明:也可以使用map檢測循環╮(╯▽╰)╭. #include < ...

  7. Calculator Conundrum UVA - 11549(floyd判圈)

    Calculator Conundrum UVA - 11549 题意: 给你一个n和k. 每次操作可以把k平方,之后取k*k的前n位 为 k. 思路: 首先可以想到,经过有限次操作后,会出现循环. ...

  8. UVA 11549 模拟 Floyed判圈法的应用 Calculator Conundrum

    此题很容易想到会出现环,那么就可以想到用map来判重,但是此题还有一种更加优越的所需空间复杂度为o(1)的算法 . #include<cstdio> #include<iostrea ...

  9. UVA 11549 calcular conundrum 计算机老谜题

    题目大意 用一个老式计算器,只显示n位数字,输入一个整数k后计算,计算器会反复平方,直至溢出,每次溢出只显示最高的n位,计算器会一直平方下去,直到出现重复的数字 分析 题目中已经暗示了计算器显示的数会 ...

最新文章

  1. 200字带你看完一本书,GPT-3已经会给长篇小说写摘要了
  2. 注意力机制的本质中文版代码
  3. 现半透明的popupwindow
  4. 带你深入AI(4)- 目标检测领域:R-CNN,faster R-CNN,yolo,SSD, yoloV2
  5. mysql提高缓存_合理配置MySQL缓存 提高缓存命中率
  6. spring boot apollo demo
  7. 用U盘或移动硬盘安装Windows7 (超简单制作Win7安装U盘方法)
  8. 利用linux shell自己主动顶贴
  9. python正则表达式代码_python正则表达式的使用(实验代码)
  10. java jexl_一种表达式语言的解析引擎JEXL简单使用
  11. 【Android】AsyncTask机制
  12. Atitit 运营之道 互联网产品运营之道 attilax、著 1. 概念 2 1.1. 核心点 内容 媒体 用户 活动 数据分析 2 2. 第二章内容运营   2 2.1. 2.1 创建用户模
  13. 555定时器+74系列芯片搭建八路抢答器,30s倒计时,附Proteus仿真等
  14. 这几款学习app,你值得看一看
  15. Latex下载安装配置
  16. 半功率点为啥是-3dB
  17. 儿童python编程教程-一款儿童编程入门的理想工具——PythonTurtle
  18. 相似度衡量: 苏剑林博客-1
  19. 如何在win10安装libaio,并且使用CFLAGS和LDFLAGS环境变量指示其位置,并且如何设置DS_BUILD_AIO=0禁用async_io...
  20. python 线程安全队列_Python实现线程安全队列

热门文章

  1. matlab commsrc.pn,poly2trellis
  2. 后台用户角色权限管理设计
  3. Kubernetes----Job控制器
  4. SpringMVC整合Redis实战
  5. BERT-MRC:统一化MRC框架提升NER任务效果
  6. c#使用钩子拦截鼠标键盘事件
  7. color demura原理_AMOLED中的补偿技术之外部光学补偿(Demura)
  8. 运行内存数据加密加密
  9. Android实战技巧之八:Ubuntu下切换JDK版本
  10. C语言关于指针知识点总结【2】