现在输入一个整数 k ,每次取前 n 位,反复平方,一直下去,输出能得到的最大数。每次取前 n 位所以一定会出现循环,使用Floyd判圈法判断是否出现重复。输出循环中的最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include<cstdio> #include<algorithm> typedef long long LL; using namespace std; int buf[100]; int Next(int n,int k){ if(!k) return 0; LL k2=LL(k)*k; int l=0; while(k2>0){ buf[l++]=k2%10; k2/=10; } n=min(n,l); int ans=0; for(int i=0;i<n;++i) ans=ans*10+buf[--l]; return ans; } int main(){ int t;scanf("%d",&t); while(t--){ int n,k;scanf("%d%d",&n,&k); int ans=k,k1=k,k2=k; do{ k1=Next(n,k1); k2=Next(n,k2);ans=max(ans,k2); k2=Next(n,k2);ans=max(ans,k2); }while(k1!=k2); printf("%d\n",ans); } return 0; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **