UVA 11549 - Calculator Conundrum(模拟+周期规律)

来源:互联网 发布:免费下载skype软件 编辑:程序博客网 时间:2024/06/07 04:52

Problem C

CALCULATOR CONUNDRUM

Alice got a hold of an old calculator that can display n digits. She was bored enough to come up with the following time waster.

She enters a number k then repeatedly squares it until the result overflows. When the result overflows, only the most significant digits are displayed on the screen and an error flag appears. Alice can clear the error and continue squaring the displayed number. She got bored by this soon enough, but wondered:

“Given n and k, what is the largest number I can get by wasting time in this manner?”

Program Input

The first line of the input contains an integer (1 ≤ ≤ 200), the number of test cases. Each test case contains two integers (1 ≤ ≤ 9) and (0 ≤ < 10n) where n is the number of digits this calculator can display is the starting number.

Program Output

For each test case, print the maximum number that Alice can get by repeatedly squaring the starting number as described.

Sample Input & Output

INPUT

21 62 99
OUTPUT
999
题意:一个能显示n位的计算器,一开始输入k,然后不断平方,如果超过位数,就只保留前n位,平方过程中最大得到的数字是多少。
思路:数字不断乘,到最后会成周期规律,然后就不断去找最大数,用set记录重复的数字(因为数字挺大数组开不下)。
上面是我的思路,这个思路写起来时间效率并不高,因为set这个东西不是非常快,还有一个方法叫floyd判圈法,就是一个数字每次平方一次,一个每次平方两次,如果数字相等,就说明形成周期了,这就相当于赛跑套圈一个道理。一个速度比较快,一个比较慢,早晚会有追上的时候(即相等的时候)。
代码:
set版:
#include <stdio.h>#include <string.h>#include <set>#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int t, n;long long k;set<int> vis;void init() {vis.clear();scanf("%d%lld", &n, &k);}long long Pow(long long k) {long long ans = 0;long long t = k * k;long long save[20];int saven = 0;while (t) {save[saven++] = t % 10;t /= 10;}for (int i = saven - 1; i > max(saven - 1 - n, -1); i--)ans = ans * 10 + save[i];return ans;}int solve() {int ans = 0;while (vis.find(k) == vis.end()) {if (ans < k) ans = k;vis.insert(k);k = Pow(k);}return ans;}int main() {scanf("%d", &t);while (t--) {init();printf("%d\n", solve());}return 0;}

floyd判圈法:
#include <stdio.h>#include <string.h>#define max(a,b) ((a)>(b)?(a):(b))int t, n;long long k;void init() {scanf("%d%lld", &n, &k);}long long Pow(long long k) {long long ans = 0;long long t = k * k;long long save[20];int saven = 0;while (t) {save[saven++] = t % 10;t /= 10;}for (int i = saven - 1; i > max(saven - 1 - n, -1); i--)ans = ans * 10 + save[i];return ans;}int solve() {long long k1 = k, k2 = k, ans = k;while (1) {k1 = Pow(k1);k2 = Pow(k2); ans = max(ans, k2);k2 = Pow(k2); ans = max(ans, k2);if (k1 == k2) break;}return ans;}int main() {scanf("%d", &t);while (t--) {init();printf("%lld\n", solve());}return 0;}


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度网盘视频插件升级失败怎么办 退苹果id重新登陆照片没了怎么办 苹果升级后照片效果没了怎么办 360云盘个人云盘停止服务怎么办 小米手机账号掉了手机卡没了怎么办 百度网盘下载后不能注册怎么办 微信发出的文件无法撤回怎么办 微信群发错消息无法撤回怎么办 百度网盘登录要验证码怎么办 百度网盘备份记录怎么办能删掉 手机酷狗听歌耳机声音太小了怎么办 苹果6s微信通话声音变粗怎么办 千千静听多个列表合成一个了怎么办 别人用手机号注册了邮箱怎么办 微信身份信息验证未通过怎么办 快递地址填错了已经发到了怎么办 孩子威胁同学给她买东西吃怎么办 在超市买小孩米粉过期了怎么办 出口货物被海关扣了说仿牌怎么办 有一批仿牌被宁波海关查了怎么办 付了定金不想要车了怎么办 泥墙刮石灰上涂料现在刮腻子怎么办 月经最后一天同房了怎么办吃什么药 奶水太多了宝宝总是呛到了怎么办 婴儿刚吃完奶大量喷奶怎么办 我干活细致领导说我慢怎么办 怀孕初期吃了加明矾的粉皮怎么办 绿豆面黄豆面白面蒸馒头怎么办 画油画时把颜料染在衣服上怎么办 买的布衣柜少了一个管子怎么办 小2球刚好进2球怎么办 大2球刚好进2球怎么办 大球2进了2球怎么办 身上剩的几百块钱有掉了怎么办 刚买一天的手机电板有问题怎么办 宝宝长湿疹穿少了就感冒怎么办 照片跟视频被孩子删了怎么办 老公总是说一些不开心的话题怎么办 孩子沉迷手机篮球课不爱去怎么办 坐久了屁鼓会长疮怎么办 套胶的胶皮与海绵分离怎么办