十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
有兩個問題,一個是fact()函數里的p應該定義成double類型,第二個是printf()不應該用%d輸出double類型的值,應該用%.0f或者%.0lf
創(chuàng)新互聯成都網站建設按需網站設計,是成都網站設計公司,為茶藝設計提供網站建設服務,有成熟的網站定制合作流程,提供網站定制設計服務:原型圖制作、網站創(chuàng)意設計、前端HTML5制作、后臺程序開發(fā)等。成都網站維護熱線:028-86922220
順便說一句,這個問題只要定義fact()一個函數就夠了,輸出的時候用
printf("result = %.0f\n",fact(n)/(fact(m)*fact(n-m)));
另外兩個函數刪掉就可以了。
排列組合c階乘公式:C(n,m)=C(n,n-m)。排列組合是組合學最基本的概念。所謂排列,就是指從給定個數的元素中取出指定個數的元素進行排序。
主要的錯誤在于函數的參數傳遞理解上,如果要修改實參的值,應該采用地址傳遞,而程序設計的函數采用的是值傳遞,這種方式實參只向形參傳遞數據,而形參是無法向實參傳遞的
#includestdio.h
int main()
{
int factorial(int x);
printf("請輸入n和m的值,他們分別作為排列組合的符號的上角標和小角標。n,m必須大于等于零。\n");
printf("標注:n代表“參與選擇的元素個數”,m表示“元素的總個數”,用C來表示“排列組合”。\n");
int C,n,m,t,a,b;
printf("n=");
scanf("%d",n);
a=n;
n=factorial(n);//這里只是將n的值傳遞給x,并不修改n的值,必須顯示進行賦值
printf("m=");
scanf("%d",m);
b=m;
m=factorial(m);//這里只是將m的值傳遞給x,并不修改m的值,必須顯示進行賦值
t=a-b;
t=factorial(t);//這里只是將t的值傳遞給x,并不修改t的值,必須顯示進行賦值
C=n/(m*t);
printf("本次排列組合輸出的結果=%d,即有%d種排列方法。\n",C,C);//漏了一個變量
return 0;
}
int factorial(int x)
{
int i;
i=x-1;
if(x==0||x==1)x=1;//當n為0時,n的階乘結果為1。且當x=1是,階乘應為1。
else
{
while(i=1)
{
x=x*i;
i--;
}
}
return(x);
}