把标准答案写上去也不输出,目的是求m!/{(m-n)!*n!}
#include
float fun(int m, int n)
{
int i;
float j=1,k=1,h=1;
float x;
for(i=m;i>=1;i--)
j*=i;
for(i=n;i>=1;i--)
k*=i;
for(i=m-n;k>=1;i--)
h*=i;
x=j/(k*h);
return x;
}
int main()
{
int m=12,n=8;
float s=fun(m,n);
printf("%f",s);
return 0;
}
请大家看看是什么问题呀 谢谢
该回答引用ChatGPT
在计算组合数的时候,使用整型变量进行计算可能会导致结果溢出。因此,在本题中,可以考虑使用长整型或者浮点型变量进行计算。
在给定的代码中,我们使用浮点型变量进行计算,但是在第三个循环中,计算阶乘时的条件出现了错误,应该是 i >= h 而不是 k >= 1。
因此,修改后的代码如下所示:
#include <stdio.h>
float fun(int m, int n)
{
int i;
float j = 1, k = 1, h = 1;
float x;
for (i = m; i >= 1; i--)
j *= i;
for (i = n; i >= 1; i--)
k *= i;
for (i = m - n; i >= 1; i--)
h *= i;
x = j / (k * h);
return x;
}
int main()
{
int m = 12, n = 8;
float s = fun(m, n);
printf("%f", s);
return 0;
}
在这段代码中,我们首先使用循环计算出 m!,n! 和 (m-n)!,然后将它们相除得到组合数。由于使用了浮点型变量进行计算,因此可以避免整型变量计算时的溢出问题
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在你的 fun 函数中,第三个循环的终止条件不正确。应该是 i >= 1 而不是 k >= 1。因此,当 n > m - n 时,h 的初始值为 0,导致函数返回值为 NaN,即“Not a Number”,所以你的程序没有输出结果。
修改 fun 函数中第三个循环的终止条件后,你的程序应该像这样:
#include<stdio.h>
float fun(int m, int n) {
int i;
float j = 1, k = 1, h = 1;
float x;
for (i = m; i >= 1; i--)
j *= i;
for (i = n; i >= 1; i--)
k *= i;
for (i = m - n; i >= 1; i--)
h *= i;
x = j / (k * h);
return x;
}
int main() {
int m = 12, n = 8;
float s = fun(m, n);
printf("%f", s);
return 0;
}
这样就能正确输出结果了。