变换方式固定,只用考虑第一个数字1的位置即可
变换方式
下标i大于n时,移动至((i-n-1)*2+1)处
下标i小于n时,移动至 2*i 处
循环查找下标再次为1所用次数
比如
(1)(2)(3)(4) n=2
初始 1
1: 1 1*2
2: 1 2*2
3: 1 (4-n-1)*2+1
4: 1 (3-n-1)*2+1
#include <stdio.h>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,m,i;
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
while (scanf("%d",&n)!=EOF)
{
int a[200010]={0};
for(int i=1;i<=2*n;i++)a[i]=0;
m=0;a[1]=1,i=1;
while (1)
{
if(i<=n)
{
a[i*2]=1;
i*=2;
}
else
{
a[(i-n-1)*2+1]=1;
i=(i-n-1)*2+1;
}
m++;
if(i==1)break;
}
printf("%d\n",m);
}
return 0;
}