找规律题,其实这题想通了也很简单,就是记录1的位置,第一次时,t都等于1,然后是t=2,t=4,t=8......知道t大于了n,即1的位置到了后半部分,此时,如果1是在n+1的位置,那么它的下一次就会变成顺序的,否则就继续从前往后找,直到1在n+1的位置为止。
举个例来说,n=6,
1 2 3 4 5 6 | 7 8 9 10 11 12 //t=1;
7 1 8 2 9 3 | 10 4 11 5 12 6 //t=2;
10 7 4 1 11 8 | 5 2 12 9 6 3 //t=4;
5 10 2 7 12 4 | 9 1 6 11 3 8 //t=8
此时,1的位置已经到了后半部分,
9 5 1 10 6 2 | 11 7 3 12 8 4 //t=3;
11 9 7 5 3 1 | 12 10 8 6 4 2 //t=6;
继续往下,上半部分规律很好找,就是2^(n-1);下半部分的比较麻烦,不过写出几个序列就很好找了,可以看以下代码。
代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3 int main()
4 {
5 int n,t,k,s;
6 while(scanf("%d",&n)!=EOF)
7 {
8 t=1,s=0;
9 while(1)
10 {
11 if(t<=n)
12 {
13 s++;
14 t*=2;
15 }
16 if(t==n+1)
17 break;
18 if(t>n+1)
19 {
20 k=t%n;
21 if(k==0)
22 k=n;
23 t=(k-1)*2+1;
24 s++;
25 }
26 if(t==n+1)
27 break;
28 }
29 printf("%d\n",s+1);
30 }
31 return 0;
32 }