很简单的计算机二级程序设计,为什么程序对了结果不会输出呢

把标准答案写上去也不输出,目的是求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;
}


这样就能正确输出结果了。