codingmethod.cpp

来自「对于给定的$n$, 生成$[n]$的所有排列的算法。采用逆序数编码方法。」· C++ 代码 · 共 81 行

CPP
81
字号
#include<stdio.h>
#include<math.h>
#define N 4
void main()
{
	int i,j,k,M=1,t,v;
    for(i=1;i<=N;i++)
	{
		M=M*i;                  /*阶乘的生成*/
	}
	int a[N],b[N-1];            /*a[]为最后要填充数字的位数,b[]为n[i]数*/
	for(i=0;i<M;i++)
	{

		for(j=0;j<N;j++)
		{
	    	a[j]=0;             /*对a[]所有位均赋值为零*/
		}
		t=i;
		for(j=0;j<N-1;j++)
		{
			b[j]=t%(j+2);          /*求b[]即书中a[]的值*/
			t=(t-b[j])/(j+2);
		}
		v=b[N-2];                  /*对b[n-1]赋值到v,并且把a[]中v位置填上n*/
		a[v]=N;
		for(k=N-1;k>0;k--)
		{
			if(k==1)
			{
				for(j=0;j<N;j++)
				{
					if(a[j]==0)
					{
						a[j]=1;    /*当最后一个位置是0时把1填充进去*/
						break;
					}
				}
			}
            if(k!=1)
			{
				v=0;                        /*v为从左起对空格数的统计*/
			    for(j=0;j<N;j++)
				{
					if(v==b[k-2] && (a[j]==0))         /*v的数目刚好和得到的b[]的数相同,并且在a[]中对应位置为0
						                                 否则循环到下一个非零位置把k的值负进去*/
					{
					   a[j]=k;
					   break;
					}
				    if(a[j]==0)v=v+1;             /*累计计算位置中空格的数目*/
				
				}
			}
		}
        for(j=0;j<N;j++)
		{
			printf("%d",a[j]);
			if(j==N-1)printf("\n");
		}
		
	}
}
		
	

			     

		
		



			






⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?