編程求組合C
由於數據比較大,你不能通過組合數的計算公式C(m,n)=m!/(n!(m-n)!)直接來求(因為會溢出),可以根據C(m,n)=C(m-1,n)+C(m-1,n-1),C(i,0)=1,c(i,i)=1來求,用a[i][j]來表示C(i,j),通過循環求出來C(m,n)
#include<stdio.h>
inta[101][101];
intmain()
{
intm,n,i,j;
scanf("%d%d",&m,&n);
for(i=0;i<=100;i++)//初始化C(i,0)=1,C(i,i)=1
{
a[i][0]=1;
a[i][i]=1;
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];//循環
}
}
printf("%d ",a[m][n]);
return0;
}
B. 用C編程排列組合
#include <stdio.h>
#define MAX_NUM 26
char ach15Char[6] ="12345"; // 一定要有序的!
int comb[MAX_NUM];
void combination(int m, int n)
{
int i, j;
for (i = m; i >= n; i--)
{
comb[n] = ach15Char[i-1]; /* 選擇當前的「頭」元素 */
if (n > 1)
{
/* 進入下一次更小的組合問題 */
combination( i - 1, n - 1);
}
else
{
/* 滿了需要的組合數,輸出 */
for (j = comb[0]; j > 0; j--)
{
printf("%c", comb[j]);
}
printf("\t");
}
}
return;
}
int main(int argc, char *argv[])
{
comb[0] = 3;
combination( 5, comb[0]); /* C(15, 7) */
return 0;
}
C. VB編程題:輸入m,n的值,求組合數c(
Private Sub Command1_Click()
Dim m As Long, n As Long
m = Val(InputBox("m="))
n = Val(InputBox("n="))
If n - m < m Then m = n - m
n1 = n
f = 1
For i = 1 To m
f = f * n / i
n = n - 1
Next i
MsgBox "C(" & m & "," & n1 & ")=" & f
End Sub
D. 用自定義函數的形式 編程實現求C的組合公式
# include<stdio.h>
long mulfun (int n);
int main()
{
int M, n;
printf("please input the M and n : ");
scanf("%d %d",&M, &n);
printf("M!/n!(m!-n!) is: %d ", mulfun(M) / mulfun(n) * (mulfun(M) - mulfun(n)));
return 0;
}
long mulfun (int n) {
long mul = 1;
for (int i = 0; i < n; ++i) {
mul *= (i + 1);
}
return mul;
}
E. C語言編程求解一個排列組合問題。急!
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
void process(int *,int,int);
char *s;
int size;
void main(void)
{
int n, m;
printf("Please enter n and m:");
scanf("%d%d",&n,&m);
while(n<m|| n>9)
{
if(n>9) printf("N must less than 10\n");
else printf("N must greate or equal M\n");
printf("Please enter n and m:");
scanf("%d%d",&n,&m);
}
int *p=new int[n];
s=new char[n+1];
s[0]='\0';
for(int i=0;i<n;i++)
{
p[i]=i+1;
}
process(p,m,n);
system("pause");
}
void process(int * p,int m,int n)
{
if(m==0)
{
printf("\n");
return;
}
for(int i=0;i<n;i++)
{
if(p[i]!=0){
printf("%d",p[i]);
size=strlen(s);
s[size++]=p[i]+'0';
s[size]='\0';
p[i]=0;
process(p,m-1,n);
p[i]=i+1;
size=strlen(s);
if(size>0)s[--size]='\0';
if(size>0)
{
bool isprint=false;
for (int j=i+1;j<n;j++)
{
if(p[j]!=0){
{
isprint=true;
break;
}
}
}
if(isprint)printf("%s",s);
}
}
}
}
不要意思沒加註釋,要睡覺了。有什麼不明白的再追問吧。我要sleep了。呵呵。
不好意思沒看到最後一句等效的。看來我把問題做復雜了。呵呵。
下面的代碼是在上面的基礎上改的。有些亂了,不過運行還是沒問題的。
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
void process(int *,int,int,int);
char *s;
int size;
void main(void)
{
int n, m;
printf("Please enter n and m:");
scanf("%d%d",&n,&m);
while(n<m|| n>9)
{
if(n>9) printf("N must less than 10\n");
else printf("N must greate or equal M\n");
printf("Please enter n and m:");
scanf("%d%d",&n,&m);
}
int *p=new int[n];
s=new char[n+1];
s[0]='\0';
for(int i=0;i<n;i++)
{
p[i]=i+1;
}
process(p,m,n,0);
system("pause");
}
void process(int * p,int m,int n,int start)
{
if(m==0)
{
printf("\n");
return;
}
for(int i=start;i<n-m+1;i++)
{
if(p[i]!=0){
printf("%d",p[i]);
size=strlen(s);
s[size++]=p[i]+'0';
s[size]='\0';
p[i]=0;
process(p,m-1,n,i+1);
p[i]=i+1;
size=strlen(s);
if(size>0)s[--size]='\0';
if(size>0)
{
int count=0;
bool isprint=false;
for (int j=i+1;j<n;j++)
{
if(p[j]!=0){
{
isprint=true;
count++;
}
}
}
if(count==0||count<m)isprint=false;
if(isprint)printf("%s",s);
else return;
}
}
}
}
F. C語言編程實現求組合數P=C(n,k)的值
double lnchoose(int n, int m)
{
if (m > n)
{
return 0;
}
if (m < n/2.0)
{
m = n-m;
}
double s1 = 0;
for (int i=m+1; i<=n; i++)
{
s1 += log((double)i);
}
double s2 = 0;
int ub = n-m;
for (int i=2; i<=ub; i++)
{
s2 += log((double)i);
}
return s1-s2;
}
double choose(int n, int m)
{
if (m > n)
{
return 0;
}
return exp(lnchoose(n, m));
}
用之前調用math.h頭文件,用的話直接把值賦給choose()這個函數即可,直接調用上面的函數,返回一個double數值,可追問
G. 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;}
以上回答你滿意么?
H. C語言中組合公式的編程
int function(int n,int m)
{
int i, ret = 1;
for(i=0;i<m;i++)
ret *= (n-i);
return ret;
}
void main(void)
{
int n = 15, m =5;
int ret;
ret = function(15,5) / function(5,5);
printf("%d\n",ret);
}
I. 用c語言編程,求組合數!
#include <stdio.h>
void main()
{
void choose(int a,int b);
int a,b,c,d;
printf("請輸入兩個整數,以0,0結束\n");
scanf("%d,%d",&a,&b);
scanf("%d,%d",&c,&d);
if(c==0&&d==0)
choose(a,b);
}
void choose(int a,int b)
{
if(b>a)
{
printf("error!");
}
else
{
int fenmu=b,fenzi=a;
for(int i=a-1;i>a-b;i--)
fenzi*=i;
for(int j=b-1;j>1;j--)
fenmu*=j;
int temp;
temp=fenzi/fenmu;
printf("%d",temp);
}
}
J. c語言編程,組合數
#include<iostream>
using namespace std;double jiecheng(int n)
{
if(n==0)
return 0;
if(n==1)
return 1;
double m=n;
while(!(n<2))
{
m=m*(n-1);
n--;
}
return m;
}main()
{
int n,r;
double zuheshu;
printf("請輸入n和r(n>1且r<=n):\n");
scanf("%d%d",&n,&r);
printf("組合數=%f",zuheshu=(jiecheng(n)/(jiecheng(r)*jiecheng(n-r))));
} 這是在VC++環境中編的,如果在tuboC中運行,只需將頭文件更改下就可以了