该程序用于计算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);
请帮助我,并提前致谢。
答案 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;