我必须编写一个计算并显示以下表达式的程序:
P=(1/2-3/4)*(5/6-7/8)*...*[n/(n-1) - (n+2)/(n+3)]
我这样做了,我跑了它,它没有显示任何错误。当我运行它时,对于我输入的每个值,它显示P = 0。有什么问题?
#include <stdio.h>
int main (void)
{
float s, p=1.0;
int i, n;
printf("Enter a number:");
scanf("%d", &n);
for (i=1;i<=n;++i) {
p*=((i)/(i+1)-(i+2)/(i+3));
}
printf("p=%f\n", p);
}
答案 0 :(得分:6)
您使用的是整数运算而不是浮点运算,因此除法运算将被截断。
变化:
p*=((i)/(i+1)-(i+2)/(i+3));
为:
p*=((float)(i)/(i+1)-(float)(i+2)/(i+3));
答案 1 :(得分:2)
它不起作用,因为i
是整数:当您划分(i)/(i+1)
或(i+2)/(i+3)
时,在两种情况下都会得到零,因为当i
为正时,分母大于分子。零减零为零,p
次零为零,所以这就是你得到的。
要解决此问题,请将i
声明为float
:
#include <stdio.h>
int main ()
{
float s,p=1.0, i;
int n;
printf("Put a number:");
scanf("%d",&n);
for (i=1;i<=n;++i) {
p*=((i)/(i+1)-(i+2)/(i+3));
}
printf("\n p=%f",p);
return 0;
}
答案 2 :(得分:2)
您使用的是int
个变量,而不是float
个变量,因此i/(i+1)
和(i+2)/(i+3)
将始终评估为0
,因为它是整数除法。
只需使用一些强制转换来强制使用浮点算术进行评估:
((float)i)/(i+1)-((float)i+2)/(i+3)
答案 3 :(得分:1)
你的问题是整数除法截断而不是返回你看起来正在寻找的浮点结果:
i/(i+1)
和
(i+2)/(i+3)
C中的总是0
。