影响“c”

时间:2016-02-20 20:48:13

标签: c

该程序用于计算1/1系列的总和! + 2/2! + ..... 直到作为输入给出的数字。

这是我写的代码。

/ *我使用了5个变量和嵌套循环。我甚至不知道这是否是编写程序的好方法* /

问题:当我只是如图所示放置括号(在完整代码下面)时,输出是不同的, 为什么会这样?

#include <stdio.h>
#include <conio.h>
int main ()
{
    int a,i,n;
    float sum=0,prod;
    printf ("Enter the number\n");
    scanf ("%d",&a);
    for (i=1;i<=a;i++)
    {   
        for (n=1;n<=i;n++)
        {   
            for (prod=1;n<=i;n++)
                prod = prod * 1/n;
        }
        sum = sum + prod*i;
    }
    printf ("sum = %f\n ",sum);
    getch();
    return 0;
}

带括号

prod = prod * (1/n);

请帮助我,并提前致谢。

8 个答案:

答案 0 :(得分:1)

  

prod = prod *(1 / n); //错误

这意味着(1/n)首先完成 - 它为零(因为它们都被视为int,而1则小于n)。

  

prod = prod * 1 / n; //正确

这意味着首先完成prod * 1(从左到右关联) - 结果为double,因此最终结果prod * 1/n也是双精度(这是正确的结果)。

答案 1 :(得分:1)

prod * 1/n被解析为(prod * 1)/n并导致浮点除法。

prod * (1/n)使用整数除法,它会截断除法的结果(通常为0)。

答案 2 :(得分:1)

没有paranthesis,语句被解析为

prod = (prod * 1) / n;

由于prod是浮点数,proad * 1也是浮点数。然后该师将成为一个浮点师。

但是,如果你添加了paranthesis,那么(1/n)将是一个整数除法,因为两个操作数都是整数。因此,(1/n)&gt; n将为零。 1.然后prod也将为零。

无论如何,您的程序会调用未定义的行为,因为prod尚未初始化。

答案 3 :(得分:0)

没有括号的陈述

prod = prod * 1/n;  

将被解析为

prod = (prod * 1) / n;  

由于*/个操作数的优先级从左到右相关联。在这种情况下,prod * 1除以n

如果是

prod = prod * (1/n); 

1/n会导致0始终导致不同的结果。将其更改为

prod = prod * (1.0/n);   

会奏效。

答案 4 :(得分:0)

int a,i,n;
float sum=0,prod;

prod = prod * (1/n);

嗯,答案在你的声明中:1和n是整数,而prod是浮点数,prod = prod * 1 / n = prod / n的结果,结果将是想要的正确浮点数。 而prod = prod *(1 / n)将是prod * 0(对于n> 1),因为1 / n是int / int,结果是int。

答案 5 :(得分:0)

C从左到右操作,所以看到

prod = prod * 1 / N;

它认为prod等于prod 1然后除以n。通过将括号括在1 / N左右,您可以告诉C,prod乘以1 / N而不是其他方式。就像在数学中一样,如果你将括号放在将被单独评估的东西上,然后在完成时放回到顺序中。

答案 6 :(得分:0)

你只需要一个循环。这是我用Java编写的方式。迅速融合。此系列近似于e

的值
package math.series;

/**
 * SeriesSum approximates value for e
 * Created by Michael
 * Creation date 2/20/2016.
 * @link https://stackoverflow.com/questions/35528818/parenthesis-effecting-the-output-in-c
 */
public class SeriesSum {

    public static final int DEFAULT_NUM_TERMS = 5;

    public static void main(String[] args) {
        int n = (args.length > 0) ? Integer.parseInt(args[0]) : DEFAULT_NUM_TERMS;
        System.out.println(SeriesSum.summation(n));
    }

    public static double summation(int n) {
        double sum = 0.0;
        double term = 1.0;
        for (int i = 1; i <= n; ++i) {
            term *= i;
            sum += i/term;
        }
        return sum;
    }
}

答案 7 :(得分:0)

原因是您的代码不等同于相关的数学语句。请记住,C中的/不是除法,而是整数除法。

它有效地将数学Floor功能添加到您的语句中。在纯粹的数学术语中,你发现:

Prod * floor (1/n)Floor (prod * 1/n)不同。

您希望代码中包含非括号内容版本:prod * 1/n

但是你还需要在每次迭代时将余数添加到总和中,所以:

Prod = (prod /n) + (prod % n);

请注意,此行代码中的括号纯粹是为了您的可读性,它不会更改计算。

编辑:我相信在C中如果/运算符上的一个操作数是浮点数,那么它将执行浮点除法。如果是这样的话,你不需要将余数添加到总和中:

Prod = prod / n;