找出了规律,程序丑了点,已完工。
下面程序并不是算出来的,而是根据规律演化的。
更正一下九版公式:
n-1;(n<=2)
S(n)=
{
n/2+1;(n>2)
#include <stdio.h>
#include <stdlib.h>
#define N 16
void insert(int a[],int frompos,int len,int topos)
{
int *p,j,l,k;
k=frompos;
if(len==0)return;
p=(int *)malloc(len*sizeof(int));
if((N-k-len)<=2)
for(int i=0;i<len;i++,frompos++)
{
p[i]=a[frompos-1];
if((frompos+len-1)<=N-2)
a[frompos-1]=a[frompos+len-1];
else
a[frompos-1]=0;
}
else
for(int i=0;i<N-k-len;i++,frompos++)
{
if(i<len)
p[i]=a[frompos-1];
if((frompos+len-1)<=N-2)
a[frompos-1]=a[frompos+len-1];
else
a[frompos-1]=0;
}
a[frompos-1]=0;
for(j=0;a[j]!=0;j++);
l=j-topos+1;
for(int i=N-2;l>0;i--)
{
a[i]=a[i-len];
l--;
}
for(int i=topos-1;i-topos<len-1;i++)
{
a[i]=*p++;
}
free(p);
}
main()
{
int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},m,step=0,n,i,l=1,lastlen=0,k;
n=N-1;
k=(N-2)/2;
if((N-1)%2==0)m=(N-2)/2;
else m=(N-2)/2-1;
for(int i=0;i<N-1;i++)
{
printf("%2d ",a[i]);
}
printf("\n");
insert(a,N-k,k,2);
for(int i=0;i<N-1;i++)
{
printf("%2d ",a[i]);
}
printf("\n");
while(m--)
{
for(i=0;a[i]!=n;i++);
insert(a,i+1,2,l);
n--;
l++;
for(int i=0;i<N-1;i++)
{
printf("%2d ",a[i]);
}
printf("\n");
}
for(int j=1;j<N-1;j++)
{
if((a[j-1]-a[j])>1)l=j;
if((a[j]-a[j-1])>0)i=j;
}
lastlen=N-1-i;
insert(a,i+1,lastlen,l+1);
for(int i=0;i<N-1;i++)
{
printf("%2d ",a[i]);
}
}
[此贴子已经被作者于2017-3-25 19:43编辑过]