判断环,是竞赛常用的算法,我给大家介绍几种环判断法。
1、存储判断
核心思想:每做一次,就把产生的状态存起来,再遇到,就表示有环
例:
给你一个正整数,每次取平方,求过程以及后3位形成的环的长度是多少?
解:
#include<bits/stdc++.h>
using namespace std;
int n,s,p[10001];
int main(){
cin>>n;
while(p[n]==0){
s++;
p[n]=1;
cout<<n<<' ';
n=n*n%1000;
}
cout<<n<<endl<<s;
return 0;
}
如:
Sample 1:
Input:
987
Output:
987 169 561 721 841 281 961 521 441 481 361 321 41 681 761 121 641 881 161 921 241 81 561
22
Sample 2:
Input:
123
Output:
123 129 641 881 161 921 241 81 561 721 841 281 961 521 441 481 361 321 41 681 761 121 641
22
2、循环判断
思想:步骤存在数组里,循环一次判一次
说明:时间复杂度达到O(x^2)x为步骤,所以只是提一下
3、双变量判断法
思想:设2个变量,其中,一个变量每次执行1次,一个变量每次执行2次
说明:并不适合求步数
例:
给你一个正整数,每次取平方的后三位,最大能形成什么数
解:
#include<bits/stdc++.h>
using namespace std;
int n,a1,a2,ans;
int main(){
cin>>n;
a1=n;
a2=n*n%1000;
while(a1!=a2){
if(a1>ans)ans=a1;
if(a2>ans)ans=a2;
a1=a1*a1%1000;
a2=a2*a2%1000;
a2=a2*a2%1000;
}
cout<<ans;
return 0;
}
再说明:这算法空间占据极小