Ⅰ 求一個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語言如何實現任意數排列組合,新手求助,急
求排列組合沒有簡單方法。方法只有一個,枚舉。
有幾個位置需要列舉,就需要幾個循環。如果循環數量太多,可以用函數遞歸來枚舉。
常式:
#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語言編寫一個排列組合的程序
你的意思是說:輸入4個數,然後把這4個數任意排列,然後把組合的個數輸出?
就是輸入1/2/3/4←你可以把它看成16進制數.....(誰說16進制說沒個位的)
然後就排成
1234,4321,1432等?
問一下問題:輸入的4個數的長度固定嗎?(比如都是4位)如果不固定長度一樣嗎?(比如:1df45.4fda4,324f,da345)
Ⅳ 用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語言用程序排列組合數字
#include <iostream.h>//實現數據的全排序
void swap(int *a,int x,int y)//數據交換
{
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
void Perm(int *a,int k,int m)//實現全排序
{
if ( k ==m)
{
for (int i=0;i<=m;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
else
{
for (int j =k;j<=m;j++)
{
swap(a,k,j);
Perm(a,k+1,m);
swap(a,k,j);
}
}
}
int main()
{
int a[10];
for (int i=0;i<10;i++)
{
a[i] = i;
}
Perm(a,0,9);
return 0;
}
//怎麼和上一道是一樣的呢,而且還簡單一些。你可以把數字弄少點來檢查我的程序是否正確
Ⅵ 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語言中的排列組合問題;
f(m, n)表示m個黑球n個白球的排法,那好。
假如這個問題給你了,你會這樣想:
1、我先把第一位放黑球,那麼後面的排法有多少種:當然是f(m - 1, n)種,因為少了一個黑球。
2、同理,我先放白球,那麼有f(m, n - 1)種。
總共就有f(m-1,n)+f(m,n-1)種,後面就遞歸了。但不能無限遞歸,需要指定界限,然後就有if(m==0||n==0) return 1;
這個和數學歸納法很相似。
Ⅷ 用c語言編寫程序,輸出7,8,9三個數字的全部排列組合順序
voidmain()
{
intmaxRow=5;//輸出行數
intnum=1;
for(inti=0;i<maxRow;i++)
{
for(intj=0;j<=i;j++)
{
printf(num++);
printf(" ");
}
printf(" ");
}
}
Ⅸ c語言編程排列組合
void Show(int n,int len ,char str[], char p[],int *i){/*函數功能說明:
密碼窮舉法 遞歸演算法參數說明:len 密碼可選元素的個數,實際等於 strlen(str);
n 密碼位數。
STR[]密碼表。
*p 密碼排列組合的臨時存檔*/int a;n--;for(a=0; a < len; a++){p[n]=str[a];
if(n==0)printf("%d:%s ",(*i)++,p);
if(n0)Show(n,len , str,p,i);}}
/*驅動程序 用於測試*/
int main(void){char str[]="abcdef";//密碼表 可選元素集合可根據選擇修改
int n=4;//密碼位數,根據具體應用而定。
int len=strlen(str);//用於密碼元素集合計數。
char p[20];//存放排列組合的密碼,用於輸出。
int num=0;//存放統計個數的整數值,
int *i=#//計數器 地址。
p[n]='\0';//這個不用說啦。
printf("\n%d 位密碼,每個密碼有%d個選擇的話,共有:%d個組合。\n",n,len,*i);return 0;}
以上回答你滿意么?
Ⅹ 在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的全排列。
(10)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;
}