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;
}
时间: 2024-12-06 19:17:06

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

输入N个数,输出所有可能的排列组合(6+个小时啊,耶稣~)

输入N个数,输出所有可能的排列组合 一行代码一行泪...手都被发热的笔记本烤的不舒服了....6个多小时过去鸟...终于粗来鸟.... 昨天同学问到一个排列组合的问题,本身不会很难,原题是固定输入4个数字,例如1 2 3 4,输出所有可能的排列组合 暴力的话应该不难的.代码+debug,半个小时. 如果是输入N个数字呢? 先说简单的暴力方法,如果输入4个数字,输出所有的排列组合 代码比较短,也比较简单,没有很刻意的去把代码的风格写的好一点,所以数字常量什么的表介意.... /**********

寻找全排列的下一个数(字典序算法实现)

给出一个正整数,找出这个正整数所有数字全排列的下一个数.通俗的说就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数.举例: 如果输入:12345,则返回12354 如果输入:12354,则返回12435 如果输入:12435,则返回12453 思路: 字典序算法: 从后向前查看逆序区,找到逆序区域的前一位,作为数字置换的边界: 逆序区是指:数字大小(从左到右)排序一定会是从大到小. 所以从右往左找,第一个右边值大于左边值的位置,那么右边这个位置就是逆序区的起始点. 从右向左,

十进制转换为二进制序列,并输出1的个数,和序列的奇偶序列

★十进制转换为二进制序列,并输出1的个数,和序列的奇偶序列 #include<stdio.h> int main() { int m,i,x,y; char a[32];//int为4个字节长,占32个bit位 int count=0; printf("请输入一个数:\n"); scanf("%d", &m); for (i = 0; i < 32; i++) { if (m%2 == 1)         //统计序列中1的个数 { co

hdu 1856 求集合里元素的个数 输出最大的个数是多少

求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # include <queue> 7 # define LL

输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: 输入n个数组,数组长度不等,从每个数组取出一个数进行组合,求出所有的组合. 例子: int a[]={1,2}; int b[]={3,4,5}; 可能的组合:{1,3}:{1,4}:{1,5}:{2,3}:{2,4}:{2,5}: 搞了40分钟左右,不辱使命~ JAVA代码实现: import j

求n个数的组合的方法

求n个数的组合,利用二进制的0和1表示使用与不使用的两种状态可以拿来存储每一位的使用情况并且保证不会重复.代码如下: 1 #include <iostream> 2 #include <fstream> 3 4 using namespace std; 5 6 int main() { 7 int arr[10]; 8 int n; 9 int cnt = 0; 10 ofstream fs("a.txt"); 11 cin >> n; 12 for

C语言:输入一个数,输出比这个数小的所有素数,并求出个数。

//C语言:输入一个数,输出比这个数小的所有素数,并求出个数. 1 #include<conio.h> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #define MAX 100 5 int fun(int lim, int aa[MAX]) 6 { 7 int i, j,k=0; 8 for (i = 2; i <= lim; i++)//罗列每个数 9 { 10 for (j = 2; j < i; j++)//

求数组中任意两个数之间所有数字的和

303. Range Sum Query - Immutable   求数组中任意两个数之间所有数字的和 QuestionEditorial Solution My Submissions Total Accepted: 37248 Total Submissions: 146945 Difficulty: Easy Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j),

面试题3:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

package siweifasan_6_5; /** * @Description:在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. * @Parameters: // Parameters: // numbers: an array of integers //