zoukankan      html  css  js  c++  java
  • UVa 11549 计算器谜题(Floyd判圈算法)

    https://vjudge.net/problem/UVA-11549

    题意:

    有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位。如果一直这样做下去,能得到的最大数是多少?

    思路:

    这个肯定是会循环的。

    比较普通的做法就是用set来判断是否出现过来终止循环。

    另一个高效算法:Floyd判圈算法!!

    想象一下,假设有两个小孩子在一个“可以无限向前跑”的跑道上赛跑,同时出发,但其中一个孩子的速度是另一个两倍。如果跑到是直的,跑得快的小孩永远在前面,但如果跑道有环,则跑得快的小孩将“追上”跑得慢的小孩。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<stack>
     7 #include<queue>
     8 #include<cmath>
     9 #include<map>
    10 using namespace std;
    11 
    12 int n,k;
    13 
    14 int next(int n,int k)
    15 {
    16     int buf[105];
    17     if(!k)  return 0;
    18     int cnt=0;
    19     long long k2=(long long)k*k;
    20     while(k2)   {buf[cnt++]=k2%10;k2/=10;}
    21     if(n>cnt)   n=cnt;
    22     int ans=0;
    23     for(int i=0;i<n;i++)
    24         ans=ans*10+buf[--cnt];
    25     return ans;
    26 }
    27 
    28 int main()
    29 {
    30     //freopen("D:\input.txt","r",stdin);
    31     int T;
    32     scanf("%d",&T);
    33     while(T--)
    34     {
    35         scanf("%d%d",&n,&k);
    36         int ans=k;
    37         int k1=k,k2=k;
    38         do
    39         {
    40             k1=next(n,k1);  ans=max(ans,k1);
    41             k2=next(n,k2);  ans=max(ans,k2);   //小孩2,第一步
    42             k2=next(n,k2);  ans=max(ans,k2);   //小孩2,第二步
    43         }while(k1!=k2);  //追上以后才停止
    44         printf("%d
    ",ans);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    几道算法题及学java心得
    css入门
    关于 移动端整屏切换专题 效果的思考
    css3实现卡牌旋转与物体发光效果
    九方格抽奖插件
    绑定弹窗事件最好的方法,原生JS和JQuery方法
    整屏滚动效果 jquery.fullPage.js插件+CSS3实现
    自定义 页面滚动条
    有趣的HTML5 CSS3效果
    CSS3 过渡与动画
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6784786.html
Copyright © 2011-2022 走看看