UVA 11549-Calculator Conundrum-floyd判重

本文介绍了一种通过连续平方并截取前n位数字的方法来找出最大可能的n位数,使用C++实现两种不同效率的算法:暴力判重与Floyd判别法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给n,k

计算机只能显示前n位数字,,请一直给k作平方运算。。。得到结果不断取前n位。。。。

问能得到的最大的数字是多少(最多n位)


1、暴力 判重,遇到重复的就停止    563ms

2、flody判重    226ms



暴力方法 563ms

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
long long min(long long a,long long b)
{return a<b?a:b;}
set<long long> sb;
long long n,k;
char tm[105]; 

long long get_pre_n_num(long long k) //得到前n个数字
{
	  long long i;
	long long j=0;
	long long tmp=k;
	while(tmp)			//数字转字符串 
	{
		tm[j++]=tmp%10+'0';
		tmp=tmp/10; 
	}
	tm[j]=0;
	for(i=0;i<j/2;i++)  //逆转
		swap(tm[i],tm[j-i-1]);
	tm[n]=0;		
	long long ret=0;
	int len=min(n,j);		////取前n个数字 return
	for (i=0;i<len;i++)
		tmp=tmp*10+tm[i]-'0';
	return tmp;	
}	
int  main()
{
	long long i,j;
	
	int t;cin>>t;
		while(t--)
		{
			sb.clear();
			scanf("%lld%lld",&n,&k);
			if (k==0) 
			{
				printf("0\n");continue;
			} 
			sb.insert(k); 
			while(1)
			{ 
				k=k*k; 
				long long ss=num_to_char(k,tm); //取前n个数字
				k=ss;//直接用前n个数字平方即可

				if (sb.find(ss)!=sb.end()) //如果重复了则退出
					break;
				sb.insert(ss);
			}
			set<long long>::iterator it=sb.end();
			if (it!=sb.begin())			//取最大的
				it--;
			long long sss=*it;
				printf("%lld",sss);
			printf("\n");
		}
		
		return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值