當前位置:首頁 » 編程語言 » c語言所有組合

c語言所有組合

發布時間: 2022-04-02 00:01:51

『壹』 c語言 跪求:輸入M個數從中取N個數進行組合並輸出所有組合項

典型的組合問題,解法有遞歸、回溯等等
遞歸法較簡單,代碼如下:

void combine(int a[], int n, int m, int b[], int M);

參數:
a 存放候選數字
n 總項數
m 取出項數
b 存放選出結果
M = m

#include "stdio.h"
#define MAX 100

void combine(int a[], int n, int m, int b[], int M);

int main(void)
{
int i;
int a[MAX], b[MAX];

for (i = 1; i < 100; i++)
a[i - 1] = i;

combine(a, 5, 4, b, 4);
}

void combine(int a[], int n, int m, int b[], int M)
{
int i, j;

for (i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
combine(a, i - 1, m - 1, b, M);
else
{
for (j = M - 1; j >= 0; j--)
printf("%d ", a[b[j]]);
printf("\n");
}
}
}

其他方法可查閱相關資料。

『貳』 C語言 排列組合

發個C#的代碼:

int[] a = { 1 , 2 , 3 , 4 , 5 , 6 };
int weishu = 6;

int weishu2 = weishu - 1;
int zuida = (int)Math.Pow( 2 , weishu2 );
List<int[]> list = new List<int[]>();
for ( int i = 0 ; i < zuida ; i++ )
{
int[] b = (int[])a.Clone();
for ( int j = 0 ; j < weishu2 ; j++ )
{
int c = i >> j;
if ( (c & 1) == 1 )
{
int tmp = b[ j ];
b[ j ] = b[ j + 1 ];
b[ j + 1 ] = tmp;
}
}
list.Add( b );
}

System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine( string.Format( "共 {0} 個結果" , list.Count ) );
foreach ( int[] aa in list )
{
for ( int i = 0 ; i < aa.Length ; i++ )
{
sb.Append( aa[ i ] );
if ( (i & 1) == 1 )
sb.Append( '\t' );
}
sb.AppendLine();
}
Console.WriteLine( sb.ToString() );

運行結果:

共 32 個結果
12 34 56
21 34 56
13 24 56
23 14 56
12 43 56
21 43 56
13 42 56
23 41 56
12 35 46
21 35 46
13 25 46
23 15 46
12 45 36
21 45 36
13 45 26
23 45 16
12 34 65
21 34 65
13 24 65
23 14 65
12 43 65
21 43 65
13 42 65
23 41 65
12 35 64
21 35 64
13 25 64
23 15 64
12 45 63
21 45 63
13 45 62
23 45 61

『叄』 C語言求所有組合

STL的next_permuatation
試試羅

『肆』 跪求一個C語言程序,實現功能:任意輸入3個數,求出全部的組合。如365,全部組合有27種

3個的 要寫多個的也可以改
#include <stdio.h>
#include "string.h"

main()
{
int i,j,k,nLen,count=0;
char a3="\0";
gets(a);
nLen = strlen(a);
for (i=0;i<nLen;i++)
{
for (j=0;j<nLen;j++)
{
for (k=0;k<nLen;k++)
{
printf("%c%c%c ",ai,aj,ak);
count++;
if (count%9==0)
{
printf("\n");
}
}
}
}
}

『伍』 C語言如何實現任意數排列組合,新手求助,急

  1. 求排列組合沒有簡單方法。方法只有一個,枚舉。

  2. 有幾個位置需要列舉,就需要幾個循環。如果循環數量太多,可以用函數遞歸來枚舉。

    常式:

    #include<stdio.h>
    intmain(){
    inta[4]={1,3,4,7};//第一個位置
    intb[4]={2,5,8,10};//第二個位置
    intc[4]={6,9,11,12};//第三個位置
    inti,j,k;
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    for(k=0;k<4;k++)
    printf("%d%d%d ,",a[i],b[j],c[k]);//輸出一種排列
    getch();
    return0;
    }

『陸』 用c語言編制一程序,列出0--9十個數的所有排列組合

這個是排列,如果是組合最後一個循環判斷時候有相等的:
#include<stdio.h>
int
main()
{
for(int
i0=0;i0<9;i0++)
for(int
i1=0;i1<9;i1++)
for(int
i2=0;i2<9;i2++)
for(int
i3=0;i3<9;i3++)
for(int
i4=0;i4<9;i4++)
for(int
i5=0;i5<9;i5++)
for(int
i6=0;i6<9;i6++)
for(int
i7=0;i7<9;i7++)
for(int
i8=0;i8<9;i8++)
for(int
i9=0;i9<9;i9++)
printf("\n%d%d%d%d%d%d%d%d%d%d",i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);
}

『柒』 C語言列印一竄數字的所有組合

1.樓主的數太多了,我的機器有點落伍,顯示的時間有點漫長~~~~,我把數改成了1,2,3,3,4,7,7。顯示上也簡單點,原理是一樣的。。。另外不是很清楚樓主的所有組合是不是包括取出一部分字元串做排列組合,我弄的是所有

數字用上的全排列,就是沒有12,13這樣的組合數,樓主如果是需要顯示這樣的數,只要在主函數中做循環,分別取出1至7個數再運行deal和排列函數就行(注,調試環境是VC++6.0)
#include "stdio.h"
#include "stdlib.h"
#define NUM 30
#define N 7 //數組元素個數
static int cnt=0;//用於記錄重復數字的個數
void print(int n,int arr[]){
int i;
static int count=0;
printf("%d:",++count);
for(i=0;i<n;i++)
printf("%d",arr[i]);
printf("\t");
if(count%5==0)
printf("\n");
}

void arrange(int size,int arr[],int p){
//演算法思想:採用經典回溯法,先確定第一個位置,再對餘下的n-1位數字做全排列
//每組全排列後均把所有參與此次全排列的數與這次全排列的第一個數交換後再重復排列
//例如遞歸到排列1234後回溯一次即排列34,將4與3交換,再回溯至排列234分別將34與2交換後排列
//直至排列完成後,再分別將234與1交換後排列
//不過演算法效率在數字過大後就比較低下了,樓主可以去網上找找更高效的演算法
int i,temp;
if(p+1==size){//排列完成後列印
print(size,arr);
return;
}
for(i=p;i<size;i++){//交換
temp=arr[p];
arr[p]=arr[i];
arr[i]=temp;
arrange(size,arr,p+1);//遞歸調用排列
temp=arr[p];
arr[p]=arr[i];
arr[i]=temp;
}
}

void deal(int a[],int b[]){
//將重復數字去掉,方便全排列
int i,j;
for(i=0;i<N;i++){
if(a[i]>0){
for(j=i+1;j<N;j++){
if(a[i]==a[j]){
a[j]=-1;//重復標志
cnt++;
}
}
}
}
j=0;
for(i=0;i<=N;i++){
if(a[i]>0){
b[j++]=a[i];
}
}
}

void main(){
int a[N]={1,2,3,3,4,7,7};
int b[NUM];
deal(a,b);//處理數組
arrange(N-cnt,b,0);//排列輸出
}

2.和第一問一樣,我只選了1,2,3,3,4,7,7。程序上只是列印函數改了下,deal函數做了調整,本來想在第一問的排列基礎上再在特定的位置上插入3和7,後來發現會重復,做了很久的無用功啊。。print中的循環太多了,看起來有點累,不過主要的就是兩個大的東西,兩個循環實際是一樣的原理,樓主有興趣可試著把循環換成一個函數,可讀性會強點。下面的代碼適用性還是很廣的。
#include "stdio.h"
#include "stdlib.h"
#define NUM 30
#define N 7
static int cnt=0;//用於記錄重復數字的個數
static int t[N];//用於記錄重復數字

void print(int n,int arr[]){
//演算法思想:對有重復的數字組合排列,將它看成是對空餘位置填充數字
//先將重復的數字進行填充,即在空餘位置中取定重復數的位置,再對餘下的位置進x行全排列填充
//按此思想得到的個數為 =1260個
int a1[N-2],a2[N];
static int count=0;
for(int i=0;i<N-cnt/2-1;i++){
//取5個數,包括完全沒重復的數再加上重復的數(例如:1,2,4,3,3)
//對這5個數按照演算法思想排列
a1[i]=t[0];
for(int j=i+1;j<=N-cnt/2-1;j++){
a1[j]=t[0];
for(int k=0;k<i;k++)
a1[k]=arr[k];
for(int m=i+1;m<j;m++)
a1[m]=arr[m-1];
for(int p=j+1;p<N-cnt/2;p++)
a1[p]=arr[p-2];
for(int s=0;s<N-1;s++){//將7個數取出按照演算法排列
a2[s]=t[1];
for(int r=s+1;r<=N-1;r++){
a2[r]=t[1];
for(int y=0;y<s;y++)
a2[y]=a1[y];
for(int x=s+1;x<r;x++)
a2[x]=a1[x-1];
for(int h=r+1;h<N;h++)
a2[h]=a1[h-2];
printf("%d:",++count);
for(int c=0;c<N;c++)//將該排列列印出來
printf("%d",a2[c]);
printf("\t");
if(count%5==0)
printf("\n");
}
}

}
}
}

void arrange(int size,int arr[],int p){
int i,temp;
if(p+1==size){//排列完成後列印
print(size,arr);
return;
}
for(i=p;i<size;i++){//交換
temp=arr[p];
arr[p]=arr[i];
arr[i]=temp;
arrange(size,arr,p+1);//遞歸調用排列
temp=arr[p];
arr[p]=arr[i];
arr[i]=temp;
}
}

void deal(int a[],int b[]){
//將數組處理成只剩不重復排列的數
int i,j,k=0;
for(i=0;i<N;i++){
if(a[i]>0){
for(j=i+1;j<N;j++){
if(a[i]==a[j]){
t[k++]=a[i];//記錄重復數
a[i]=-1;
a[j]=-1;
cnt+=2;
}
}
}
}
j=0;
for(i=0;i<=N;i++){
if(a[i]>0){
b[j++]=a[i];
}
}
}

void main(){
int a[N]={1,2,3,3,4,7,7};
int b[NUM];
deal(a,b);//處理數組
arrange(N-cnt,b,0);//排列輸出
}

3.第三問比較簡單,在第二問列印程序上加上限制條件(即第三位不能是3,第七位不能是七)
#include "stdio.h"
#include "stdlib.h"
#define NUM 30
#define N 7
static int cnt=0;//用於記錄重復數字的個數
static int t[N];//用於記錄重復數字

void print(int n,int arr[]){
int a1[N-2],a2[N];
static int count=0;
for(int i=0;i<N-cnt/2-1;i++){
a1[i]=t[0];
for(int j=i+1;j<=N-cnt/2-1;j++){
a1[j]=t[0];
for(int k=0;k<i;k++)
a1[k]=arr[k];
for(int m=i+1;m<j;m++)
a1[m]=arr[m-1];
for(int p=j+1;p<N-cnt/2;p++)
a1[p]=arr[p-2];
for(int s=0;s<N-1;s++){
a2[s]=t[1];
for(int r=s+1;r<=N-1;r++){
a2[r]=t[1];
for(int y=0;y<s;y++)
a2[y]=a1[y];
for(int x=s+1;x<r;x++)
a2[x]=a1[x-1];
for(int h=r+1;h<N;h++)
a2[h]=a1[h-2];
if(a2[2]!=t[0]&&a2[6]!=t[1]){
printf("%d:",++count);
for(int c=0;c<N;c++)
printf("%d",a2[c]);
printf("\t");
if(count%5==0)
printf("\n");
}
}
}

}
}
}

void arrange(int size,int arr[],int p){
int i,temp;
if(p+1==size){//排列完成後列印
print(size,arr);
return;
}
for(i=p;i<size;i++){//交換
temp=arr[p];
arr[p]=arr[i];
arr[i]=temp;
arrange(size,arr,p+1);//遞歸調用排列
temp=arr[p];
arr[p]=arr[i];
arr[i]=temp;
}
}

void deal(int a[],int b[]){
//將數組處理成只剩不重復排列的數
int i,j,k=0;
for(i=0;i<N;i++){
if(a[i]>0){
for(j=i+1;j<N;j++){
if(a[i]==a[j]){
t[k++]=a[i];//記錄重復數
a[i]=-1;
a[j]=-1;
cnt+=2;
}
}
}
}
j=0;
for(i=0;i<=N;i++){
if(a[i]>0){
b[j++]=a[i];
}
}
}

void main(){
int a[N]={1,2,3,3,4,7,7};
int b[NUM];
deal(a,b);//處理數組
arrange(N-cnt,b,0);//排列輸出
}

『捌』 C語言編程實現 湊15的所有組合

#include<stdio.h>
#include<string.h>
#define MAX 11
bool used[MAX]={false};
int a[MAX];
int ok(int a[])
{
int i;
for(i=0;i<9;i+=3)
{
if(a[i]+a[i+1]+a[i+2]!=15)return false;
}
for(i=0;i<3;i++)
{
if(a[i]+a[i+3]+a[i+6]!=15)return false;
}
if(a[0]+a[4]+a[8]!=15)return false;
if(a[6]+a[4]+a[2]!=15)return false;
return true;
}
void DFS(int deep)
{
int i;
if(deep==9)
{
if(ok(a))
{
puts("start");
for(i=0;i<9;i+=3)
{
printf("%d %d %d\n",a[i],a[i+1],a[i+2]);
}
puts("end");
}
return ;
}
for(i=1;i<10;i++)
{
if(used[i])continue;
used[i]=true;
a[deep]=i;
DFS(deep+1);
used[i]=false;
}
}
int main(void)
{
DFS(0);
return 0;
}

『玖』 c++/c語言 枚舉所有組合並輸出

樓上的遞歸實現確實不錯,但是壞處是不方便將所有的排列組合結果保存起來,除非用上全局變數或靜態變數。
如果nCount是固定的,問題就會變得非常簡單,比如當nCount=3的時候,用上3個for循環即可。我借用宏來簡化定義不同nCount情況下的代碼,沒有樓上的遞歸函數方法高明,但是執行效率應該會更高些,且方便收集所有的組合結果。

voidcombineAll(inta[],intnBegin,intnEnd,intnCount)
{
int*buf=newint[nCount*2+1];
int*end=buf,*arr=buf+nCount+1;//intend[nCount];intarr[nCount+1];
end[0]=nEnd-nCount+1;
for(intk=1;k<nCount;k++)
end[k]=end[k-1]+1;
arr[-1]=nBegin-1;

#defineLOOP(k)for(arr[k]=arr[k-1]+1;arr[k]<end[k];arr[k]++)
#defineSTORE{for(intk=0;k<nCount;k++)printf("%d",a[arr[k]]);printf("");}//orwecanpusha[arr[0~nCount]]toavector

switch(nCount){
case1:
LOOP(0)STOREbreak;
case2:
LOOP(0)LOOP(1)STOREbreak;
case3:
LOOP(0)LOOP(1)LOOP(2)STOREbreak;
case4:
LOOP(0)LOOP(1)LOOP(2)LOOP(3)STOREbreak;
case5:
LOOP(0)LOOP(1)LOOP(2)LOOP(3)LOOP(4)STOREbreak;
default:
throw;//orwecanusearecursivefunction
}

#undefLOOP
#undefSTORE

delete[]buf;
}

intmain()
{
inta[]={0,1,2,3,4,5};
intnBegin=0,nEnd=6,nCount=3;
PrintAll(a,nBegin,nEnd-1,nCount,"");
printf(" -------------------- ");
combineAll(a,nBegin,nEnd,nCount);
returngetchar();
}

熱點內容
winsock搜伺服器ip 發布:2025-01-18 03:49:32 瀏覽:393
安卓手機藍牙默認地址在哪裡 發布:2025-01-18 03:47:57 瀏覽:906
shell腳本文件路徑 發布:2025-01-18 03:40:31 瀏覽:483
sql語句執行錯誤 發布:2025-01-18 03:21:49 瀏覽:651
資料庫雙引號 發布:2025-01-18 03:10:20 瀏覽:79
學java和php 發布:2025-01-18 03:01:03 瀏覽:452
怎麼開伺服器的埠 發布:2025-01-18 02:54:23 瀏覽:648
別克君越編程 發布:2025-01-18 02:32:24 瀏覽:914
ftp游戲下載網站 發布:2025-01-18 02:09:04 瀏覽:628
python調用另一個文件中的函數 發布:2025-01-18 02:03:54 瀏覽:597