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