
C语言,关于阶乘和排列组合的代码,求指导,谢谢了!
这是题目:代码如下:#include<stdio.h>intmain(){intfactorial(intx);printf("请输入n和m的值,他们分别作为排列组合的符...
这是题目:
代码如下:
#include<stdio.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;
factorial(n);
printf("m=");
scanf("%d",&m);
b=m;
factorial(m);
t=b-a;
factorial(t);
C=n/(m*t);
printf("本次排列组合输出的结果=%d,即有%d种排列方法。\n",C);
return 0;
}
int factorial(int x)
{
int 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);
}
然后这是运行结果:
输出的结果一直都是0,不知道哪里出错了。
求指导,谢谢了! 展开
代码如下:
#include<stdio.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;
factorial(n);
printf("m=");
scanf("%d",&m);
b=m;
factorial(m);
t=b-a;
factorial(t);
C=n/(m*t);
printf("本次排列组合输出的结果=%d,即有%d种排列方法。\n",C);
return 0;
}
int factorial(int x)
{
int 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);
}
然后这是运行结果:
输出的结果一直都是0,不知道哪里出错了。
求指导,谢谢了! 展开
3个回答
展开全部
主要的错误在于函数的参数传递理解上,如果要修改实参的值,应该采用地址传递,而程序设计的函数采用的是值传递,这种方式实参只向形参传递数据,而形参是无法向实参传递的
#include<stdio.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);
}
#include<stdio.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);
}
更多追问追答
追问
我改了之后还是出不了答案,大神能帮忙看一下吗?谢谢!
追答
可以出结果,你在程序中把n和m搞反了,
程序里计算组合数采用的的是
C=n/(m*t); //这个式子可以看出n应该是组合数的下标,m为组合数的上标,所以你把前面的提示n和m对调一下就可以了,比如若要计算“3个中取2个”,只需要将n=3,m=2就可以算出为3
展开全部
#include<stdio.h>
int main()
{
long factorial(long x);
long C,n,m,t,a,b;
printf("请输入n和m的值,他们分别作为排列组合的符号的上角标和小角标。n,m必须大于等于零。\n");
printf("标注:n代表“参与选择的元素个数”,m表示“元素的总个数”,用C来表示“排列组合”。\n");
printf("n=");
scanf("%ld",&n);
a=n;
n=factorial(n);
printf("m=");
scanf("%ld",&m);
b=m;
m=factorial(m);
t=b-a;
t=factorial(t);
C=m/(n*t);
printf("本次排列组合输出的结果=%ld,即有%ld种排列方法。\n",C);
return 0;
}
long factorial(long x)
{
long i;
i=x-1;
if(x==0||x==1)x=1;
else
{
while(i>=1)
{
x=x*i;
i--;
}
}
return(x);
}
int main()
{
long factorial(long x);
long C,n,m,t,a,b;
printf("请输入n和m的值,他们分别作为排列组合的符号的上角标和小角标。n,m必须大于等于零。\n");
printf("标注:n代表“参与选择的元素个数”,m表示“元素的总个数”,用C来表示“排列组合”。\n");
printf("n=");
scanf("%ld",&n);
a=n;
n=factorial(n);
printf("m=");
scanf("%ld",&m);
b=m;
m=factorial(m);
t=b-a;
t=factorial(t);
C=m/(n*t);
printf("本次排列组合输出的结果=%ld,即有%ld种排列方法。\n",C);
return 0;
}
long factorial(long x)
{
long i;
i=x-1;
if(x==0||x==1)x=1;
else
{
while(i>=1)
{
x=x*i;
i--;
}
}
return(x);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你 factorial(int x)函数的返回值没有被主函数接收,所以主函数中,n,m,t的值都没变
你可以在主函数中调用时令
n= factorial(n);m= factorial(m);t= factorial(t);
再做这三个步骤前,要先算出t=b-a;
这样应该正确了
printf("本次排列组合输出的结果=%d,即有%d种排列方法。\n",C);这个输出这里
格式串中有两个%d,也即需要两个传入的值,所以后面应该有两个C
printf("本次排列组合输出的结果=%d,即有%d种排列方法。\n",C, C);
你可以在主函数中调用时令
n= factorial(n);m= factorial(m);t= factorial(t);
再做这三个步骤前,要先算出t=b-a;
这样应该正确了
printf("本次排列组合输出的结果=%d,即有%d种排列方法。\n",C);这个输出这里
格式串中有两个%d,也即需要两个传入的值,所以后面应该有两个C
printf("本次排列组合输出的结果=%d,即有%d种排列方法。\n",C, C);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询