zoukankan      html  css  js  c++  java
  • Uva 11549 Calculator Conundrum

    题意:有一个老式计算器,只能显示n为数字。有一天,你无聊了,于是输入一个整数k,然后反复平方,直到溢出。每次溢出时,计算器会显示出结果最高的

    n位和一个错误标记。然后清除错误标记,继续平方。如果一直这样做下去,能得到的最大数是多少。

    题解:简单的推一下,发现其前几位是一个环状结构,及计算器显示出的数将出现循环,应为不管怎么样,数总会出现重复。

    这样方法一可以不断模拟,吧结果存入数组中不断找,map去做应该是可以的。

    但是这里讲一个的算法,即floyd判圈算法,可以大幅降低空间复杂度O(1),其运行时间也下降不少。

    可以想象一下,在一个圆形操场上跑,一个孩子跑得比另一个孩子快,那么总会有那么一个时刻会追上,二结果就是记录每次的值即可。

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<string>
    #include<cstring>
    
    using namespace std;
    
    int t,n;
    long long k1,k2,ans;
    
    long long max(long long a,long long b)
    {
        return a>b?a:b;
    }
    long long next(long long x,int k)
    {
        x=(long long)x*x;
        long long xx=x,num=0;
        while (xx!=0)
        {
            xx/=10;
            num++;
        }
        for (int i=1;i<=num-k;i++)
        {
            x/=10;
        }
        ans=max(ans,x);
        return x;
    }
    int main()
    {
        scanf("%d",&t);
        while (t--)
        {
            scanf("%d%lld",&n,&k1);
            k2=k1,ans=k1;
            do
            {
                k1=next(k1,n);
                k2=next(k2,n);
                k2=next(k2,n);
            }while(k2!=k1);
            printf("%lld
    ",ans);
        }
    }
  • 相关阅读:
    mac系统终端的color scheme配置和vim配置
    用子网掩码划分子网
    堆排序
    面试遇到两个稍显变态的题目,mark一下
    移动端适配的问题
    移动端click事件延时
    行内元素之间间距的产生与去除
    JS怎么判断一个对象是否为空
    Java面向对象基础
    Java中的final关键字
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/6985284.html
Copyright © 2011-2022 走看看