當前位置:首頁 » 編程語言 » 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