当前位置:首页 » 编程语言 » c语言计算排列数
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言计算排列数

发布时间: 2022-07-20 07:57:55

c语言 排列算法 已有代码 看不懂 求分析

可以这样理解:假如要求 序列 12345的排列数,那么perm(list,k,m)中的k就是0,m就是4(都是指的下标),也就是说求list数组中第一个数到第五个数的排列数。
12345的排列数可以递归的拆成五部分,第一部分、第一个数取1,然后求后四个数2345的排列数,第二部分、第一个数取2,然后求后四个数1345的排列数,第三部分、第一个数取3,然后求后四个数1245的排列数,第四部分、第一个数取4,然后求后四个数1235的排列数,第五部分、第一个数取5,然后求后四个数1234的排列数。这是第一轮递归拆分,然后上面的五部分都可以再进行递归拆分,每个部分可以拆成第一个数和后三个数,然后再对后三个数进行全排列,这样一直递归的拆分,直到求perm(list,4,4)即一个数的的全排列,就是它本身,说明全排列已经生成,打印出此时list中的值即可。

对应代码中对应的步骤为:

if (k == m) { //m=k说明要求的全排列只有一个数,此时list已经存放了一次全排列的值,输出即可
for (i = 0; i <= m; i++)
printf("%c",list[i]);
putchar('\n');
}

else //m!=k的话 ,说明list中k到m的元素还可以递归拆解
for (i=k; i <= m; i++) { //for循环进行递归拆解
Swap (list[k], list[i]); //list[k]是当前要拆解的全排列中的第一个数,它每次和从k到m中的某个数list[i]交换,让list[i]成为第一个数,然后递归的求 从k+1位置到m位置的全排列。

Perm (list, k+1, m);
Swap (list [k], list [i]); //求完了一次全排列,要把list[k]还原为第一个数,以进行下次for循环。
}

不知道我解释的明不明白,不明白可以继续问。

⑵ 在C语言中,如何输出一组数的排列组合

#include <stdio.h>

#include <stdlib.h>

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++;

}

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 k;//输入自然数的个数

printf("请输入连续自然数的个数:");

scanf("%d",&k);

int *list = (int *)malloc(k);

for (int i = 0; i < k; i ++)

{

list[i] = i + 1;

}

// int list[] = {1, 2, 3, 4, 5};

perm(list, 0, k-1);

printf("total:%d ", n);

return 0;

}

该程序的输入为一个任意自然数n,将输出从1到n的全排列。

(2)c语言计算排列数扩展阅读:

C语言的基本数的排列法

1、冒泡排序:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。

#include <stdio.h>

int main(void)

{

int a[1001];

int n,i,j,t;

scanf("%d",&n);//n为要排序的数的个数

//输入要排序的数

for(i=0;i<n;++i)

scanf("%d",a+i);

//接下来进行排序

for(i=0;i<n-1;++i)//n个数,总共需要进行n-1次

{ //n-1个数排完,第一个数一定已经归位

//每次会将最大(升序)或最小(降序)放到最后面

for(j=0;j<n-i-1;++j)

{

if(a[j]>a[j+1])//每次冒泡,进行交换

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

for(j=0;j<n;++j)

printf("%-5d ",a[j]);

printf(" ");

}

return 0;

}

2、选择排序:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置。

#include <stdio.h>

int main(void)

{

int a[1001];

int n,i,j,t;

scanf("%d",&n);//n为要排序的数的个数

//输入需要排序的数

for(i=0;i<n;++i)

scanf("%d",a+i);

//接下来进行排序

for(i=0;i<n-1;++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行

{

for(j=i+1;j<n;++j)//j从i后一个开始,a[i]与a[j]进行比较

{

if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换

{

t=a[i];

a[i]=a[j];

a[j]=t;

}

}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置

for(j=0;j<n;++j)

printf("%-5d",a[j]);

printf(" ");

}

return 0;

}

⑶ C语言,计算排列数Amn, 急 不要Result之类的

#include<stdio.h>

int a[5];
int len1,len2,len3;

void input(int len1,int len2,int len3)
{
printf("%d %d %d\n",a[len1],a[len2],a[len3]);
}

void solve(int len1,int len2,int len3)
{
input(len1,len2,len3);
if(len1==2) return;
if(len3<4) len3++;
else if(len2<3)
{
len2++;
len3=len2+1;
}
else if(len1<2)
{
len1++;
len2=len1+1;
len3=len2+1;
}
solve(len1,len2,len3);
}

void main()
{
int i;
for(i=0;i<5;i++) a[i]=i+1;
printf("所构成组合是:\n");
solve(0,1,2);
return ;
}

⑷ C语言中三个数排序

用C语言编写通过if将3个数排序:

#include<stdio.h>/*函数头:输入输出头文件*/

void main()/*空类型:主函数*/

{

inta,b,c,t;/*定义变量的数据类型为整型*/

printf("输入3个数,中间用空格隔开:");/*输出文字提示*/

scanf("%d%d%d",&a,&b,&c);/*输入3个数字*/

if(a<b)/*判断a是否小于b*/

{t=a;a=b;b=t;}/*是,则a、b的值互换*/

if(a<c)/*判断a是否小于c*/

{t=a;a=c;c=t;}/*是,则a、c的值互换*/

if(b<c)/*判断b是否小于c*/

{t=b;b=c;c=t;}/*是,则b、c的值互换*/

printf("从小到大:%d,%d,%d ",c,b,a);/*输出从小到大排列的数*/

printf("从大到小:%d,%d,%d ",a,b,c);/*输出从大到小排列的数*/

}

(4)c语言计算排列数扩展阅读

输入三个数,比较其大小,并从大到小输出。

#include<stdio.h>

int main(){

inta,b,c;

scanf("%d%d%d",&a,&b,&c);

if(a<b){

intflag=a;

a=b;

b=flag;

}

if(a<c){

intflag=a;

a=c;

c=flag;

}

if(b<c){

intflag=b;

b=c;

c=flag;

}

printf("%d%d%d",a,b,c);

}

⑸ c语言编程问题,计算出从n 个不同元素中取出m 个元素(m≤n)的排列数。

就是求C(n,m)的值?按定义,C(n,m)=n*n-1*n-2*...*(n-m+1)/m!,就这么做呗。。
int ans = 1; //答案
int i;
for (i = n; i >n-m; i--) ans = ans * i; //先计算n*(n-1)*...*(n-m+1),就是顺次乘n乘n-1一直乘到n-m+1
for (i = 1; i<=m; i ++) ans = ans / i; //再除以m的阶乘,顺次除1除2除3一直除到m。。
ans就是答案……这边没有c的编译器,include还有语法错误什么的就不搞了。。

⑹ 求一个C语言排列组合的算法

#include<stdio.h>
#include<stdlib.h>
intmain()
{
intas,sd,df;
inta[4]={1,2,3,4};
for(as=0;as<=3;as++)
{
for(sd=0;sd<=3;sd++)
{
for(df=0;df<=3;df++)
{
if(as!=sd&&as!=df&&sd!=df)
{
printf("%d%d%d ",a[as],a[sd],a[df]);
}
}
}
}
}

⑺ c语言编写函数计算排列数amn

int Rank(int m , int n)
{
int nResualt=1 ;

while(n-->0)

nResualt*=(m--) ;

return nResualt ;

}

没考虑可能结果太大,超出整型表示的范围

⑻ 求c语言全排列算法

这个说起来太麻烦了, 我找了一个, 你看看行不, 不可以的话, 私聊吧.
全排列用的是 置换算法,
算法这东西重在理解。具体代码并不那么重要。

全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为

例说明如何编写全排列的递归算法。

1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。

由于一个数的全排列就是其本身,从而得到以上结果。

2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。

即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.

从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。

因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。

为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。

算法如下:

#include <stdio.h>

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;
}
链接: http://..com/question/71586341.html?si=2