为什么这个运算出来时0.00000呀

img


#include
double fact(int m,int n);
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    printf("%lf",fact(m,n));
    return 0;
}
double fact(int m,int n)
{
    int a,b,c,d;
    for(a = 1;a<=n;a++)
    {
        a*=(a+1);
    }
    for(b = 1;b<=m;b++)
    {
        b*=(b+1);
    }
    for(c = 1;c<=(n-m);c++)
    {
        c*=(c+1);
    }
    d = a/(b*c);
    return d;
}

d = a/(b * c) 是整数相除,进行的是整除,没有小数
改为:
d = a*1.0/(b * c);

abcd不要用int,用double
特别是d,应该用double
d = a/(double)(b*c);
否则是整除

函数类型是double,你却定义的整形

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/763612
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:医学影像报告异常检测线上0.895开源
  • 除此之外, 这篇博客: c语言输出0.000000或乱码,深究中的 使用强制类型转换运算符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    平时在编译器waring下我们会偷懒地用 隐式类型转换
    这里介绍一下强制类型转换运算符

    #include <stdio.h>
    int main(void)
    {
    	float b;
    	b = 12.5;
    
    	printf("%d\n", b);
    	printf("%d\n", (int)b);
    
    	return 0;
    }
    

    ↓见证奇迹的时刻到了!!!
    在这里插入图片描述
    不输出“0”了!!!!
    这里可以理解为命令(告诉)程序用int类型取读取b变量!

    我读《深入理解计算机系统》得到的知识(有点个人理解,不晓得是否正确恰当)——指针的类型(数据类型)实际上是由位数的多少读取方式区分的,所以数据类型的不同会导致我们不希望出现的bug。

    补充:
    1.强制类型转化也有c++式的(类似于实例化对象的风格)

    	printf("%d\n", (int)b);	//c		式的强制类型转化
    	printf("%d\n", int(b));	//c++	式的强制类型转化
    

    2.void*型的指针由于其未指定具体的数据类型(void型),可以用强制类型转化变成任何你需要的类型,很好用的。(在本篇博客里的“二进制输出”代码就有用到)


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^