當前位置:編程學習大全網 - 編程語言 - 數學裏的Cnm用C語言怎麽表示

數學裏的Cnm用C語言怎麽表示

希望能幫到妳。來自/s/blog_64b236da0100vg33.html

#include <stdio.h>

#include <stdlib.h>

//從n個元素的數組a中,取m個元素的組合

bool zuhe(char a[],int n,int m)

{//p[x]=y 取到的第x個元素,是a中的第y個元素

int index,i,*p;

p=(int*)malloc(sizeof(int)*m);

if(p==NULL)

{

return false;

}

index=0;

p[index]=0;//取第壹個元素

while(true)

{

if(p[index]>=n)

{//取到底了,回退

if(index==0)

{//各種情況取完了,不能再回退了

break;

}

index--;//回退到前壹個

p[index]++;//替換元素

}

else if(index==m-1)

{//取夠了,輸出

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

{

printf("%c",a[p[i]]);

}

printf("\n");

p[index]++; //替換元素

}

else

{//多取壹個元素

index++;

p[index]=p[index-1]+1;

}

}

free(p);

return true;

}

//對n個元素的數組a,進行全排列

bool pailie(char a[],int n)

{//p[x]=y 取到的第x個元素,是a中的第y個元素

int i,j,temp,*p;

p=(int*)malloc(sizeof(int)*n);

if(p==NULL)

{

return false;

}

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

{//初始排列

p[i]=i;

}

while(true)

{//循環m=n!次

//輸出壹種排列情況

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

{

printf("%c",a[p[i]]);

}

printf("\n");

//從後向前查找,看有沒有後面的數大於前面的數的情況,若有則停在後壹個數的位置。

for(i=n-1;i>0 && p[i]<p[i-1];i--);

//若沒有後面的數大於前面的數的情況,說明已經到了最後壹個排列,返回

if(i==0) break;

//從後查到i,查找大於p[i - 1]的最小的數,記入j

for(j=n-1;j>i && p[j]<p[i-1];j--);

//交換p[i-1]和p[j]

temp=p[i-1];p[i-1]=p[j];p[j]=temp;

//倒置p[i]到p[n-1]

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

{//交換p[c]和p[d]

temp=p[i];p[i]=p[j];p[j]=temp;

}

}

free(p);

return true;

}

int main()

{

char a[]="ABCD";

zuhe(a,4,2);//組合

pailie(a,3);//排列

return 0;

}

  • 上一篇:linux C下多線程接收數據怎麽進行存儲再統壹處理
  • 下一篇:三十而已中的三個女人誰最勵誌?
  • copyright 2024編程學習大全網