【省选模拟试题】计算器谜题
来源:互联网 发布:md5码算法 编辑:程序博客网 时间:2024/06/06 09:48
【问题描述】
有一个老式计算器,只能显示n位数字。有一天,你无聊了,于是输入一个整数k,然后反复平方,直到溢出。每次溢出时,计算器会显示出结果的最高n位和一个错误标记。然后清除错误标记,继续平方。如果一直这样做下去,能得到的最大数是多少?比如,当n=1, k=6时,计算器将依次显示6、3(36的最高位),9、8(81的最高位),6(64的最高位),3…..。
【输入格式】
输入的第一行为一个整数T(1≤T≤200),即测试数据的数量。以下T行,每行包含两个整数n和k(1≤n≤9,0≤k<10^n)。
【输出格式】
对于每组数据,输出你能得到的最大数。
【输入样例】
2
1 6
2 99
【输出样例】
9
99
真的是谜一般的一道题。
因为题目没有说要循环多少次,可以知道得出的数一定是会出现循环的(不然一直找下去肯定会超时)。一旦出现已经出现过的数,说明循环出现。
可以用set或map判断,但更好的是用Floyd判圈法判定:
爸爸和孩子在一个跑道上跑步,爸爸的速度是孩子的两倍,同时出发,如果跑道是直的爸爸会一直在孩子前面,边跑边回头逗孩子,若跑道是环形的,爸爸将会追上孩子,孩子跑了半圈,爸爸跑了一圈,孩子跑一圈,爸爸跑两圈,此时父子两相遇了。这道题目简单来说就是求某一个循环里的最大值,而floyd判圈算法,爸爸路程最少是完全遍历了一个某循环。int k1=k,k2=k; ans=k; do { task(n,k1,k1); task(n,k2,k2); ans=max(ans,k2); task(n,k2,k2); ans=max(ans,k2); }while(k1!=k2);
【数据范围】
1≤T≤200
1≤n≤9,0≤k<10^n
#include<cstdio>#include<algorithm> using namespace std; int t,n,k,ans,a[150];int d[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};void read(int &x){ x=0; bool ok=0; char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-') ch=getchar(); while((ch>='0'&&ch<='9')||ch=='-') { if(ch=='-') ok=1; else x=x*10+ch-'0'; ch=getchar(); } if(ok) x=-x;}void task(int n,int k,int &x){ if(!k) { x=0; return; } long long t=(long long)k*k; while(t>=d[n]) t=t/10; x=(int)t;} int main(){ //freopen("in1.txt","r",stdin); //freopen("out.txt","w",stdout); read(t); while(t--) { read(n); read(k); int k1=k,k2=k; ans=k; do { task(n,k1,k1); task(n,k2,k2); ans=max(ans,k2); task(n,k2,k2); ans=max(ans,k2); }while(k1!=k2); printf("%d\n",ans); } return 0; }
0 0
- 【省选模拟试题】计算器谜题
- 模拟计算器
- 模拟计算器
- 模拟计算器
- 模拟计算器
- 模拟计算器
- 模拟计算器程序
- Java模拟计算器
- 大数相加,模拟计算器
- 【C语言】 模拟计算器
- Java模拟计算器
- 【9108】模拟数学计算器
- 计算器的改良 (模拟)
- MFC模拟计算器
- java模拟计算器
- SDUT 1133 模拟计算器
- ccf模拟试题第一题
- 常见试题:PHP计算器
- 1. JMeter 3.0 环境搭建
- 从机器学习谈起
- 实现Socket通信
- Codeforces Round #360 A 简单模拟
- Win10下安装Win7(新买固态硬盘)
- 【省选模拟试题】计算器谜题
- CSU 1807: 最长上升子序列~
- 第二周项目2-程序的多文件组织
- 使用jsp实现网站计数的功能
- 进程间通信--管道
- UVA 1664 Conquer a New Region (并查集+贪心)
- AJAX
- HH实习
- 直播利器---AnyRTC实时视频连麦互动直播