Floyd 判环算法
一 算法内容
该算法的内容类似赛跑,两个人在操场上赛跑,跑的快的一定能够比跑得慢的多跑一圈,在链表的判环中,我们可以使用一个快指针和一个慢指针,慢指针每次走一步,快指针每次走两步,当快指针和慢指针相遇的时候,就说明这个慢指针已经走了一个环
二 例题
#include<iostream>
#define ll long long
using namespace std;
int buf[20];
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;
}
if(n > L) 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);
for(int i = 1;i <= t;i++)
{
int n,k;
scanf("%d%d",&n,&k);
int ans = k;
int k1 = k,k2 = k;
do{
k1 = next(n,k1);
k2 = next(n,k2); if(ans < k2) ans = k2;
k2 = next(n,k2); if(ans < k2) ans = k2;
// k2是我们的快指针,每次走两次
}while(k1!=k2);
printf("%d\n",ans);
}
}