十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
有两个问题,一个是fact()函数里的p应该定义成double类型,第二个是printf()不应该用%d输出double类型的值,应该用%.0f或者%.0lf
创新互联成都网站建设按需网站设计,是成都网站设计公司,为茶艺设计提供网站建设服务,有成熟的网站定制合作流程,提供网站定制设计服务:原型图制作、网站创意设计、前端HTML5制作、后台程序开发等。成都网站维护热线: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);
}