UVA - 11549 Calculator Conundrum (循环节)(Floyd判圈算法,快慢指针)

原创 2016年08月31日 12:38:46

Alice got a hold of an old calculator that can display
n
digits. She was bored enough to come up with
the following time waster.
She enters a number
k
then repeatedly squares it until the result over ows. When the result
over ows, only the
n
most signi cant digits are displayed on the screen and an error ag appears. Alice
can clear the error and continue squaring the displayed number. She got bored by this soon enough,
but wondered:
\Given
n
and
k
, what is the largest number I can get by wasting time in this manner?”
Input
The rst line of the input contains an integer
t
(1

t

200), the number of test cases. Each test case
contains two integers
n
(1

n

9) and
k
(0

k<
10
n
) where
n
is the number of digits this calculator
can display
k
is the starting number.
Output
For each test case, print the maximum number that Alice can get by repeatedly squaring the starting
number as described.
SampleInput
2
1 6
2 99
SampleOutput
9
99

题解:
一般对于这种无限循环的东西来说,都是有规律可循的,比如这道题就是循环节的运用,不断的平方取前n个数字,然后判断是否出现过就行了。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#include<set>
#include<cmath>

set<int> S;

int main(){
    int T,n,k;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&k,&n);
        int ans=n;
        S.clear();
        int now=n;
        long long t;
        while(true){
            t=(long long)now*now;
            int sum=0;
            int digit=(int)log10(t)+1;
            if(digit>k){
                for(int i=0;i<digit-k;++i){
                    t/=10;
                }
            }
            if(S.find((int)t)!=S.end())break;
            ans=max(ans,(int)t);
            S.insert(t);
            now=t;
        }
        printf("%d\n",ans);
    }
    return 0;
}

这里使用了set,不仅仅空间上消耗很大,时间上也并不是最优的。
这道题最好的方法是使用Floyd判圈算法来解决环的问题,Floyd判圈算法是通过快慢指针来实现的。

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;

int Next(int now,int k){
    long long t=(long long)now*now;
    int digit=(int)log10(t*1.00)+1;
    if(digit>k){
        for(int i=0;i<digit-k;++i)t/=10;
    }
    return (int)t;
}

int main() {
    int T,n,k;
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d",&n,&k);
        int ans=k;
        int slow=k,fast=Next(k,n);
        while(slow^fast) {
            slow=Next(slow,n);
            if(fast>ans)ans=fast;
            fast=Next(fast,n);
            if(fast>ans)ans=fast;
            fast=Next(fast,n);
        }
        printf("%d\n",ans);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

UVA 11549 Calculator Conundrum Floyd判圈算法 Brent判圈算法 相关性质及证明

简介了 Floyd判圈算法 Brent判圈算法 的 相关性质及证明
  • dpppBR
  • dpppBR
  • 2017年07月20日 10:27
  • 353

Floyd判圈算法理解

关于该算法,wiki上有详细说明。 https://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare https://zh.wikip...
  • Javasus
  • Javasus
  • 2015年11月24日 18:16
  • 2803

暴力,STL,哈希技术,Floyd判圈算法(计算器谜题,uva 11549)

想了老半天,只会暴力,然后就过了。。 实现由三种方法,一是STL,而是哈希技术,三是Floyd判圈法。 就速度而言,Floyd判圈法>哈希技术>STL。分别跑了70ms,180ms,480...
  • xl2015190026
  • xl2015190026
  • 2016年10月25日 00:26
  • 1940

UVA 11549 Calculator Conundrum(floyd判圈法+两种速度慢的一般写法)

这题一定会出现循环的,因为如果截取n位数,那么数的范围是从1~10^n,所以如果最坏情况从1~10^n全部跑完,那么肯定会跑到其中一个已经跑过的数,所以一定会循环。 速度最慢的 set+stream ...
  • qq_33901573
  • qq_33901573
  • 2016年09月30日 18:45
  • 67

uva 11549计算器谜题(floyd判圈算法)

floyd判圈算法(龟兔赛跑算法)
  • u014664226
  • u014664226
  • 2015年05月20日 18:13
  • 518

Kmp找字符串循环节——Period ( POJ 1961 )

题目链接: http://poj.org/problem?id=1961 分析: 给出一个字符串长度为N,从左变开始取2~N个字符出来构成一个新字符串,若新字符串能被一个最短的循环节构成则输出新字...
  • FeBr2
  • FeBr2
  • 2016年07月15日 15:09
  • 1048

Floyd 判圈 算法

转自 leetcode 202------判断开心数 给定任意正数,比如19。 计算该正数各位上的数字的平方和,即12 + 92 = 82 重复第二步,对计算结果进行计算,得到 82 + 22...
  • Salesman_Tangseng
  • Salesman_Tangseng
  • 2016年05月08日 11:17
  • 121

UVa 11549 计算器迷题(判重和Folyd判圈算法)

题意: 计算器谜题。有一个老式计算器,只能显示n位数字。有一天,你无聊了,于是输入一个整数k,然后反复平方,直到溢出。每次溢出时,计算器会显示出结果的最高n位和一个错误标记。然后清除错误标记,继续平...
  • PK0071
  • PK0071
  • 2013年11月13日 17:16
  • 806

Floyd判圈算法

参考:http://blog.csdn.net/javasus/article/details/50015687 Floyd判圈算法(Floyd Cycle Detection Algori...
  • qq_34494458
  • qq_34494458
  • 2017年06月25日 19:57
  • 213

证明利用快慢指针寻找有环单链表中环的起点算法

问题:给定一个有环单链表,找到链表中环的起点,也就是说,找到下图中的单链表中Join点: (本图来源于http://www.cnblogs.com/xudong-bupt/p/3667729.h...
  • l294265421
  • l294265421
  • 2016年01月07日 20:39
  • 1579
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA - 11549 Calculator Conundrum (循环节)(Floyd判圈算法,快慢指针)
举报原因:
原因补充:

(最多只允许输入30个字)