UVA 11549-Calculator Conundrum-floyd判重

给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;
}


你可能感兴趣的:(UVA 11549-Calculator Conundrum-floyd判重)