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