首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含除法的表达式的意外结果

包含除法的表达式的意外结果
EN

Stack Overflow用户
提问于 2013-04-26 23:11:12
回答 4查看 171关注 0票数 2

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

代码语言:javascript
复制
P=(1/2-3/4)*(5/6-7/8)*...*[n/(n-1) - (n+2)/(n+3)]

我这样做了,我运行它,它没有显示任何错误。当我运行它时,对于我输入的每个值,它都会显示P=0。怎么啦?

代码语言:javascript
复制
#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);
}
EN

回答 4

Stack Overflow用户

发布于 2013-04-26 23:12:45

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

更改:

代码语言:javascript
复制
p*=((i)/(i+1)-(i+2)/(i+3));

至:

代码语言:javascript
复制
p*=((float)(i)/(i+1)-(float)(i+2)/(i+3));
票数 6
EN

Stack Overflow用户

发布于 2013-04-26 23:12:54

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

要解决此问题,请将i声明为float

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2013-04-26 23:12:59

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

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

代码语言:javascript
复制
((float)i)/(i+1)-((float)i+2)/(i+3)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16239727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档