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 }
# ProblemVerdictLanguageRun TimeSubmission Date
1127482711549Calculator ConundrumAcceptedC++0.5242013-02-11 07:35:50

记录一下~只用了0.5s~

转载于:https://www.cnblogs.com/zjutzz/archive/2013/02/11/2910019.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值