找出了规律,程序丑了点,已完工。
下面程序并不是算出来的,而是根据规律演化的。
更正一下九版公式:
           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编辑过]