• uva11549Calculator Conundrum


    题意:有一个老式计算器,只能保存最多n位数,如果结果超出n位,则保留前n位。现在输入一个n和一个k,k表示一个数字,然后不停的求k的平方并令k=k*k,发现会出现循环的结果,求所有结果种最大的一个。

    分析:暴力模拟可以过的,但有更好的算法。暴力:用哈希、set都可以。高效算法:Floyd判圈算法,假设两个小孩在有环形的跑道上跑,一个速度为v,另一个速度为2*v,出发点相同,那么总会有相遇的时候,相遇的时候就是跑完一圈了,那么最大值一定跑过了~

    代码:

    View Code
     1 #include <stdio.h>
     2 #include <iostream>
     3 #define DEBUG
     4 using namespace std;
     5 int buf[10];
     6 int next(int n, int k){
     7     if(k==0) return 0;
     8     long long k2 = (long long)k*k;
     9     int len = 0;
    10     while(k2>0){
    11         buf[len++]=k2%10;
    12         k2/=10;
    13     }
    14     if(n>len) n=len;            //k很小、n很大的情况
    15     int ans=0;
    16     for(int i=0; i<n; i++){
    17         ans = ans*10 + buf[--len];
    18     }
    19     return ans;
    20 }
    21 int main(){
    22 #ifndef DEBUG
    23     freopen("in.txt", "r", stdin);
    24 #endif
    25     int cas;
    26     scanf("%d", &cas);
    27     while(cas--){
    28         int n, k;
    29         scanf("%d%d", &n, &k);
    30         int k1=k, k2=k, ans=k;
    31         while(true){
    32             k1 = next(n, k1);
    33             k2 = next(n, k2);
    34             if(ans<k2) ans=k2;
    35             k2 = next(n, k2);
    36             if(ans<k2) ans=k2;
    37 
    38             if(k1==k2) break;
    39         }
    40         printf("%d\n", ans);
    41     }
    42     return 0;
    43 }
    #   Problem Verdict Language Run Time Submission Date
    11274827 11549 Calculator Conundrum Accepted C++ 0.524 2013-02-11 07:35:50

    记录一下~只用了0.5s~

    Greatness is never a given, it must be earned.
  • 相关阅读:
    ASCII码对照表
    有种美叫做放弃
    OCX和DLL的区别
    江湖经验:喝酒的学问技巧
    TC2.0实现多文件编译
    希尔排序
    CalcOpticalFlowPyrLK的使用(转)
    简单选择排序的实现
    VS2008中解决方案窗口的问题
    用友T3用友通行政单位没有损益类科目,如何做期间损益结转?
  • 原文地址:https://www.cnblogs.com/zjutzz/p/2910019.html
Copyright © 2020-2023  润新知