uva11549Calculator Conundrum

简介: 题意:有一个老式计算器,只能保存最多n位数,如果结果超出n位,则保留前n位。现在输入一个n和一个k,k表示一个数字,然后不停的求k的平方并令k=k*k,发现会出现循环的结果,求所有结果种最大的一个。 分析:暴力模拟可以过的,但有更好的算法。

题意:有一个老式计算器,只能保存最多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~

目录
相关文章
|
算法
uva 11549 CALCULATOR CONUNDRUM
题目链接 刘汝佳算法竞赛经典入门训练指南p42
32 0
UVa11549 - Calculator Conundrum (Floyd判圈法)
UVa11549 - Calculator Conundrum (Floyd判圈法)
55 0
|
存储
LeetCode 227. Basic Calculator II
实现一个基本的计算器来计算一个简单的字符串表达式的值。 字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
56 0
LeetCode 227. Basic Calculator II
HDU-1012,u Calculate e
HDU-1012,u Calculate e
|
C++
蓝桥杯 - C++ calculation
蓝桥杯 - C++ calculation
157 0