floyd 判圈算法 UVa 11549 计算器谜题
题目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; }