#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,你却定义的整形
不知道你这个问题是否已经解决, 如果还没有解决的话:平时在编译器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型),可以用强制类型转化变成任何你需要的类型,很好用的。(在本篇博客里的“二进制输出”代码就有用到)