2

我必须编写一个程序来计算并显示以下表达式:

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);
}
4

4 回答 4

6

您使用的是整数算术而不是浮点数,因此除法运算被截断。

改变:

p*=((i)/(i+1)-(i+2)/(i+3));

至:

p*=((float)(i)/(i+1)-(float)(i+2)/(i+3));
于 2013-04-26T15:12:45.217 回答
2

它不起作用,因为它i是整数:当你除(i)/(i+1)或时(i+2)/(i+3),在两种情况下你都会得到一个零,因为当i是正数时,分母大于分子。零减零是零,p乘以零是零,这就是你得到的。

要解决此问题,请声明ifloat

#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;
}
于 2013-04-26T15:12:53.727 回答
2

您使用的是int变量,而不是float变量,因此i/(i+1)并且(i+2)/(i+3)将始终评估为,0因为它是整数除法。

只需使用一些强制转换来强制使用浮点算法进行评估:

((float)i)/(i+1)-((float)i+2)/(i+3)
于 2013-04-26T15:12:59.430 回答
1

您的问题是整数除法会截断而不是返回您似乎正在寻找的浮点结果:

 i/(i+1)

 (i+2)/(i+3)

总是0在 C 中。

于 2013-04-26T15:12:47.170 回答