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

来源:互联网 发布:video.js点击全屏播放 编辑:程序博客网 时间:2024/05/18 03:39

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;}
0 0
原创粉丝点击