UVA11549 Calculator Conundrum 计算器谜题

  就觉得这题的暴力解法时间复杂度应该会很高,可能循环节会比较小吧

  比较好的收获就是这个Floyd判环法

  

#include <set>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 100005;
const int INF = 0x3f3f3f3f;
LL pow10 (int n)
{
    LL ans = 1;
    for(int i = 1;i<=n;++i)ans*=10;
    return ans;
}
LL m;
LL next(LL k)
{
    k*=k;
    while(k>=m)k/=10;
    return k;
}
int main()
{
//    freopen("in.txt","r",stdin);
    int T;scanf("%d",&T);
    while(T--)
    {
        LL n,k;
        cin>>n>>k;
        m = pow10(n);
        LL k1 = k,k2 = k,ans = k;
        do
        {
            k1 = next(k1);
            k2 = next(k2);ans=max(ans,k2);
            k2 = next(k2);ans=max(ans,k2);
        }
        while(k1!=k2);
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-10-29 22:10:09

UVA11549 Calculator Conundrum 计算器谜题的相关文章

UVa11549:Calculator Conundrum

UVa11549:Calculator Conundrum 题目大意 有一个老旧的计算器只能显示前n个数字.现在给定一个数字k,每次给k平方,如果答案长度超过n则从最高位开始显示n个数字,丢弃其余数字. 要求:求出计算器能显示的最大数字. Solution1(naive) 本题中得到的数列会出现循环,可以用一个set记录所有得到的数字,一旦出现重复数字停止循环,输出set中的最大值即可. AC-Code(C++) Time:540ms #include <iostream> #include

UVA之11549 - Calculator Conundrum

[题目] Problem C CALCULATOR CONUNDRUM 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 overflows. When the

[2016-03-19][UVA][11549][Calculator Conundrum]

时间:2016-03-19 21:27:43 星期六 题目编号:[2016-03-19][UVA][11549][Calculator Conundrum] 题目大意:给定数k每次取前n位不断平方,求出现的最大值是多少 方法: 方法1:模拟一遍过程,直到出现循环 方法2:Floyd判断算法,定义两个k,每次k1走一次,k2走两次,知道k1,k2相同 方法1:STL超级暴力方法 方法2:小小优化版 方法3:Floyd判圈算法 方法1:STL超级暴力方法 #include <set> #inclu

例题1.19 计算器谜题 UVa11549

1.题目描述:点击打开链接 2.解题思路:本题是一道普通的模拟题,根据题意易知计算器显示的数将会出现循环,因为显示的n位数一共就有限种情况,而平方的次数是无限多的.所以不妨一个个的模拟,每次都看新得到的数是否以前出现过,如果出现过就跳出循环.但如何判断是否出现过呢?第一种方法是利用STL中的set,同时写一个Next函数求出下一个k值.下面一共给出三个不同的代码,来分别体会一下效率上的巨大差异. 3.代码: (一,Next函数中使用string,stringstream) #define _CR

Basic Calculator 基本计算器-Leetcode

1.题目: Implement a basic calculator to evaluate a simple expression string. The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces . You may assume that the given expressi

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

https://vjudge.net/problem/UVA-11549 题意: 有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位.如果一直这样做下去,能得到的最大数是多少? 思路: 这个肯定是会循环的. 比较普通的做法就是用set来判断是否出现过来终止循环. 另一个高效算法:Floyd判圈算法!! 想象一下,假设有两个小孩子在一个“可以无限向前跑”的跑道上赛跑,同时出发,但其中一个孩子的速度是另一个两倍.如果跑到是直的,跑得快的小孩永远

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

 题意:有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 思路:这个题一定会出现循环,所以一个个模拟,遇到相同的就再之前所有数中找最大的输出即可. 最容易想到的就是set判重,一开始k直接生算每次除十......超时 然后看了书,用string,ac,很方便但是时间达到了4s,果然string和stringstream好慢啊......... 又改成了记录k*k的每一位,

Designing Efficient Algorithms [Examples]~C - Calculator Conundrum

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 overflows. When the result overflows, only the n most s

UVA 11549 Calculator Conundrum Floyd判圈

题目链接:点击打开链接 题意: 输入n k,表示计算器能显示n位数字,初始有一个数字k 每次操作 k = k^2, 若超出n位则截取前n位. 求能获得的最大数字. 思路: 首先我们能判断这个操作一定存在循环. 那么如何终止循环,利用Floyd判圈法 让两个循环child1和child2刚开始都为k,然后child1每次变换一次,child2每次变换2次: 这样当child1再次等于child2时说明已经至少经过一个循环节了,因为child2已经从后面赶上child1了 import java.i