首页 > 代码库 > n全排列输出和 n个数的组合(数字范围a~b)

n全排列输出和 n个数的组合(数字范围a~b)

n全排列输出:

int WPermutation(int num, bool bRepeat)

num表示num全排列

bRepeat标志是否产生反复元素的序列。


int Permutation(int n, int* A, int cur, bool bRepeat) 
{
	static int number = 0;
	if(cur == n)
	{   
		number++;
		for(int i = 0; i< n; i++)
		{
			printf("%d ", A[i]);
		}
		printf("\n");
	}
	else
	{
		for(int i = 1; i <= n; i++)
		{
			int ok = 1;
			for(int j = 0; j < cur; j++)    
			{
				if(!bRepeat)
				{
					if(A[j] == i)
					{
						ok = 0;
					}
				}
			}
			
				if(ok)
				{
					A[cur] = i;
					Permutation(n, A, cur + 1, bRepeat);
				}			

		}
	}

    return number;
}
int WPermutation(int num, bool bRepeat)
{
	printf("%d permutation(%s): %d ~ %d\n", num, bRepeat?"repeat mode":"single mode", 1, num);
	int n = num;
	int *A = (int*)malloc(n*sizeof(int));
	memset(A, 0, sizeof(n*sizeof(int)));
	int cur = 0;
	int number = Permutation(n, A, cur, bRepeat);
	delete [] A ;
	A = NULL;
	printf("over!\n");
	return number;

}


n个数的组合(数字范围st~en),考虑反复元素:

int Wpermutation(int st, int en, int n, bool bRepeat);

n表示n个数字组合

每一个数字范围:st~en

bRepeat标志是否产生反复元素的序列。


int Permutation(int st, int en, int n, int* A, int cur, bool bRepeat)
{
	static int number = 0;

	if(cur == n)
	{   
		number++;
		for(int i = 0; i< n; i++)
		{
			printf("%d ", A[i]);
		}
		printf("\n");
	}
	else
	{
		for(int i = st; i <= en; i++)
		{
			int ok = 1;
			for(int j = 0; j < cur; j++)
			{
				if(!bRepeat)
				{
					if(A[j] == i)
					{
						ok = 0;
					}
				}
			}

			if(ok)
			{
				A[cur] = i;
				Permutation(st, en, n, A, cur + 1, bRepeat);			
			}			

		}
	}

	return number;
}

int Wpermutation(int st, int en, int n, bool bRepeat)
{
	printf("%d permutation(%s): %d ~ %d\n", n, bRepeat?"repeat mode":"single mode", st, en);
	int num = en - st + 1;
	if(n > num)
	{
		bRepeat = true;
		printf("too many number, to be repeat mode:\n");
	}

	int *A = (int*)malloc(n*sizeof(int));
	memset(A, 0, sizeof(n*sizeof(int)));
	int cur = 0;
	int number = Permutation(st, en, n, A, cur, bRepeat);
	delete [] A ;
	A = NULL;
	printf("over!\n");
	return number;
}

n全排列输出和 n个数的组合(数字范围a~b)