注意这答题的答案并不唯一
解释见图
#include <cstdio>
#include <cstdlib>
using namespace std;
int a[10005];
int ans[10005];
void compute(int l,int r)// l和r 是在数组中的位置
{
int p,q;
p=l;
if(r-l==1||r==l||r<l)return;//当只剩下两个元素的时候结束
else
{
int m=(r+l)/2;
q=m+1;
for(int j=0;j<=r-l;j++)
{
if(j%2==0)//说明其为偶数位置
ans[p++]=a[j+l];
else //奇数位置
ans[q++]=a[j+l];
}
for(int i=l;i<=r;i++)
a[i]=ans[i];
compute(l,m);
compute(m+1,r);
}
}
int main()
{
int n;
while(scanf("%d",&n)==1&&n)
{
for(int i=0;i<n;i++)
a[i]=i;
compute(0,n-1);
printf("%d:",n);
int i;
for(i=0;i<n;i++)
printf(" %d",ans[i]);
printf("\n");
}
return 0;
}