UVa 11549 Calculator Conundrum (模拟+Floyd判环)

本文介绍了UVa11549 CalculatorConundrum的解题思路,通过Floyd判环算法解决计算器不断平方并溢出的问题,找到过程中出现的最大数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UVa 11549 Calculator Conundrum

题目大意:

给一个长度为n位的计算器,初始数是k,不断对其进行平方.若溢出,只保留前n位(从最高位开始),求得到的最大数是多少.

题目分析:

将数反复平方,肯定会出现相同数,那么出现相同数时就可以停止,问题在于如何判断是否形成环.可以选择使用set或者hash判断,但是空间规模比较大,那么可以选择采用Floyd判环算法.试想,两个人绕着操场跑步,A速度为1,B速度为2,若不存在环,AB不会相遇;若存在环,当A,B相遇时B恰巧比A多跑1圈,此时也就可以停止循环.

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

typedef long long ll;

int buf[50];

int go(int n,int k)//k平方之后的数 
{
    if(k==0) return 0;
    ll k2=(ll)k*k;
    int L=0;
    while(k2>0) buf[++L]=k2%10,k2/=10;
    int ret=0;
    for(int i=L;i>L-n;i--) ret=ret*10+buf[i];
    return ret;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--) {
        int n,k;
        scanf("%d%d",&n,&k);
        int k1=k,k2=k,ans=k;
        do {//Floyd判环,可以理解为k1速度为1,k2速度为2,那么当k1==k2的时候存在环,k2恰巧比k1多跑一圈 
            k1=go(n,k1);
            k2=go(n,k2);ans=max(ans,k2);
            k2=go(n,k2);ans=max(ans,k2);
        }while(k1!=k2);
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值