int n = 0;
void swap(int a, int b)
{
int m;
m = a;
a = b;
b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf("total:%d\n", n);
return 0;
}
//>解:Cnm=Anm/Amm
式中,排列数(又叫选排列数)Anm、全排列数Ann的表示法:
连乘表示:
Anm=n(n-1)(n-2)(n-m+1)
阶乘表示:
Anm=n!/(n-m)!
Ann=n(n-1)(n-2)321=n!
例如:A85=87654
----连乘法;
A85=87654321/321=8!/(8-5)!
组合数Cnm=Anm/Amm=n(n-1)(n-2)(n-m+1)/m(m-1)(m-2)321
Amm---全排列数
=n!/m!(n-m)!2
例如:C85=87654/12345=[87654321/123]/12345
=87654/12345
=56
注意:组合数公式是由于排列数的表示方法推导出来的。
扩展资料:
公式P是排列公式,从N个元素取M个进行排列(即排序)。(P是旧用法,现在教材上多用A,即Arrangement)
公式
排列及计算公式
从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列。
从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号
p(n,m)表示。
p(n,m)=n(n-1)(n-2)……(n-m+1)=
n!/(n-m)!(规定0!=1)
符号
1、C-组合数
A-排列数(在旧教材为P)N-元素的总个数
R-参与选择的元素个数
!-阶乘,如5!=5×4×3×2×1=120C-Combination
组合
P-Permutation排列
(现在教材为A-Arrangement)
2、排列组合常见公式
kCn/k=nCn-1/k-1(a/b,a在下,b在上)Cn/rCr/m=Cn/mCn-m/r-m
参考资料:
1 2 3 4 4 4 5 5 6
他们写成一排有多少可能??
总排列数为A9 9(9!)
这几个元素之间的全排列为1!1!1!3!2!1!(就是各个元素数目的阶乘乘积)
写成一排有多少可能??
为用总排列数除以这几个元素之间的全排列数
即
9!/(1!1!1!3!2!1!)
算一下就出来了
明白了么,希望对你有所帮助。求采纳共有120种 计算方法:5!=54321=120
参考资料:
根据排列的定义,两个排列相同,当且仅当两个排列的元素完全相同,且元素的排列顺序也相同。例如,abc与abd的元素不完全相同,它们是不同的排列;又如abc与acb,虽然元素完全相同,但元素的排列顺序不同,它们也是不同的排列。
从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号Anm(或Pnm)表示。
排列数公式如右图所示:
排列计算公式
n个不同元素全部取出的一个排列,叫做n个不同元素的一个全排列。这是在排列数公式中,m=n,即有:
Ann=n·(n-1)·(n-2)·…·3·2·1
就是说,n个不同元素全部取出的排列数,等于正整数1到n的连乘积。正整数一到n的连乘积,叫做n的阶乘,用n!表示。
全排列公式
Ann=n·(n-1)·(n-2)·…·3·2·1=n!,我们规定0!=1
参考资料(2):阶乘:正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。 例如所要求的数是6,则阶乘式是1×2×3×……×6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1×2×3×……×n,设得到的积是x,x就是n的阶乘。
2表示方法
编辑
任何大于1的自然数n阶乘表示方法:
n!=1×2×3×……×n
或
n!=n×(n-1)!
320以内数的阶乘
编辑
以下列出0至20的阶乘:
0!=1,注意(0的阶乘是存在的)
1!=1,
2!=2,
3!=6,
4!=24,
5!=120,
6!=720,
7!=5,040,
8!=40,320
9!=362,880
10!=3,628,800
11!=39,916,800
12!=479,001,600
13!=6,227,020,800
14!=87,178,291,200
15!=1,307,674,368,000
16!=20,922,789,888,000
17!=355,687,428,096,000
18!=6,402,373,705,728,000
19!=121,645,100,408,832,000
20!=2,432,902,008,176,640,000
另外,数学家定义,0!=1,所以0!=1!
而当n≥5时,n!的个位数字都是0
以上参考资料均源自百度百科
排列组合计算公式如下:
1、从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。
2、从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
排列就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。
排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。 排列组合与古典概率论关系密切。
扩展资料
排列组合的发展历程:
根据组合学研究与发展的现状,它可以分为如下五个分支:经典组合学、组合设计、组合序、图与超图和组合多面形与最优化。
由于组合学所涉及的范围触及到几乎所有数学分支,也许和数学本身一样不大可能建立一种统一的理论。
然而,如何在上述的五个分支的基础上建立一些统一的理论,或者从组合学中独立出来形成数学的一些新分支将是对21世纪数学家们提出的一个新的挑战。
参考资料:
2、显然,选取的规则不同,排序的结果也不同,则可以得到不同的排列。
3、以最常见的全排列为例,用S(A)表示集合A的元素个数。用1、2、3、4、5、6、7、8、9组成数字不重复的九位数。
4、则每一个九位数都是集合A的一个元素,集合A中共有9!个元素,即S(A)=9!如果集合A可以分为若干个不相交的子集,则A的元素等于各子集元素之和。可以用C语言实现数组的全排列,详细方法如下
问题出自linux C 一站式编程网站,定义一个数组,编程打印它的全排列
程序的主要思路是:
1把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。
2把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列。
3把第3个数换到最前面来,准备打印3xx,再对后两个数1和2做全排列。
可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要自己想。你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。
解题过程:
1当N = 1的时候,则直接打印数列即可。
2当N = 2的时候,设数组为 [a, b]
打印a[0], a[1] (即a,b)
交换a[0],a[1]里面的内容
打印a[0],a[1] (此时已变成了[b, a] )
3当N = 3的时候,数组为 [a, b, c]
31把a放在 a[0] 的位置(原本也是如此,a[0] = a[0]),打印b,c的全排列(即a[1], a[2]的全排列)
32把b放在a[0]的位置(这时候需要交换原数组的a[0]和a[1]),然后打印a, c的全排列,打印完后再换回原来的位置,即a还是恢复到a[0],b还恢复到a[1]的位置
33把c放在a[0]的位置(这时候需要交换的是原数组的a[0]和a[2]),然后打印a, b的全排列,打印完后再换回原来的位置,即a还是恢复到a[0],b还恢复到a[1]的位置
至此,全排列完成
当 N = 4,5,6,……的时候,以此类推。
程序代码:
#include <stdioh>
#define N 3
int a[N];
void perm(int);
void print();
void swap(int, int);
int main()
{
int i,n;
int offset;
for(i = 0; i<N; i++)
a[i] = i + 97;
perm(0);
}
void perm(int offset)
{
int i, temp;
if(offset == N-1)
{
print();
return;
}
for(i = offset; i < N; i++)
{
swap(i, offset);
perm(offset + 1);
swap(i, offset);
}
}
void print()
{
int i;
for(i = 0; i < N; i++)
printf(" %c ",a[i]);
printf("\n");
}
void swap(int i, int offset)
{
int temp;
temp = a[offset];
a[offset] = a[i];
a[i] = temp;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)