【问题标题】:Unexpected result of expressions with division除法表达式的意外结果
【发布时间】:2023-03-12 05:29:01
【问题描述】:

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

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

【问题讨论】:

  • main() 函数中是否有 return 语句?
  • @Lion:不需要,IIRC。 main 如果没有显式返回其他值,则隐式返回 0。

标签: c


【解决方案1】:

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

变化:

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

到:

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

【讨论】:

  • 也可以说p *= i/(i+1.0f) - (i+2.0f)/(i+3.0f);。任何将int 强制转换为float 的方法都应该有效。
【解决方案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;
}

【讨论】:

    【解决方案3】:

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

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

    ((float)i)/(i+1)-((float)i+2)/(i+3)
    

    【讨论】:

      【解决方案4】:

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

       i/(i+1)
      

       (i+2)/(i+3)
      

      在 C 中总是0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多