码迷,mamicode.com
首页 > 编程语言 > 详细

UVa 11549 计算器谜题(Floyd判圈算法)

时间:2017-04-29 12:01:28      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:queue   input   color   最大   stdin   ret   stream   targe   while   

https://vjudge.net/problem/UVA-11549

题意:

有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位。如果一直这样做下去,能得到的最大数是多少?

 

思路:

这个肯定是会循环的。

比较普通的做法就是用set来判断是否出现过来终止循环。

另一个高效算法:Floyd判圈算法!!

想象一下,假设有两个小孩子在一个“可以无限向前跑”的跑道上赛跑,同时出发,但其中一个孩子的速度是另一个两倍。如果跑到是直的,跑得快的小孩永远在前面,但如果跑道有环,则跑得快的小孩将“追上”跑得慢的小孩。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 using namespace std;
11 
12 int n,k;
13 
14 int next(int n,int k)
15 {
16     int buf[105];
17     if(!k)  return 0;
18     int cnt=0;
19     long long k2=(long long)k*k;
20     while(k2)   {buf[cnt++]=k2%10;k2/=10;}
21     if(n>cnt)   n=cnt;
22     int ans=0;
23     for(int i=0;i<n;i++)
24         ans=ans*10+buf[--cnt];
25     return ans;
26 }
27 
28 int main()
29 {
30     //freopen("D:\\input.txt","r",stdin);
31     int T;
32     scanf("%d",&T);
33     while(T--)
34     {
35         scanf("%d%d",&n,&k);
36         int ans=k;
37         int k1=k,k2=k;
38         do
39         {
40             k1=next(n,k1);  ans=max(ans,k1);
41             k2=next(n,k2);  ans=max(ans,k2);   //小孩2,第一步
42             k2=next(n,k2);  ans=max(ans,k2);   //小孩2,第二步
43         }while(k1!=k2);  //追上以后才停止
44         printf("%d\n",ans);
45     }
46     return 0;
47 }

 

UVa 11549 计算器谜题(Floyd判圈算法)

标签:queue   input   color   最大   stdin   ret   stream   targe   while   

原文地址:http://www.cnblogs.com/zyb993963526/p/6784786.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!