题目http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2544
floyd 判圈算法 参考 http://blog.csdn.net/l03071344/article/details/8707135
前面的solve 求k的最前n位
我之前用的函数是 不晓得为什么不可以。。
int solve(int k,int n)
{
char ss[100];
sprintf(ss,"%s",k);
ss[n]='\0';
sscanf(ss,"%d",&k);
return k;
}
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<set>
using namespace std;
int solve(int k,int n)
{
char ss[100];
__int64 k2;
int l=0;
k2=(__int64)k*k;
while(k2)
{
ss[l++]=k2%10;
k2/=10;
}
int ans=0,count=0;
while(n--&&l--)
{
count++;
ans=ans*10+ss[l];
}
return ans;
}
int main()
{
int n,k,ans,k1,k2;
int i,j,m,t;
scanf("%d",&t);
while(t--)
{
set<int> s; //用到容器的时候 总是不记得清空 贡献几次wa 将定义的放在
这里就可以不要清空容器了 不过会很耗空间 还好这里没有超
scanf("%d%d",&n,&k);
ans=k;
k1=k2=k;
do
{
k1=solve(k1,n);
k1=solve(k1,n); if(ans<k1) ans=k1;
k2=solve(k2,n); if(ans<k2) ans=k2;
}
while(k1!=k2);
printf("%d\n",ans);
}
return 0;
}