C 影响“中输出的括号”;";
该程序用于计算系列1/1!+2/2! + ..... 直到输入给定的数字 这是我写的代码 /*我使用了5个变量和嵌套循环。我甚至不知道这是否是编写程序的好方法*/ 问题:当我如图所示(在完整代码下面)插入括号时,输出是不同的, 为什么会这样C 影响“中输出的括号”;";,c,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 numbe
#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;
将被解析为
prod = (prod * 1) / n;
由于*
和/
的优先级相同,操作数从左到右关联。在这种情况下,prod*1
除以n
如果发生
prod = prod * (1/n);
1/n
总是导致0
并导致不同的结果。改成
prod = prod * (1.0/n);
会有用的
产品=产品*(1/n);//错
这意味着首先执行(1/n)
,即为零(两者均视为int
,1小于n
)
prod=prod*1/n;//正确的
这意味着prod*1
首先完成(从左到右关联)-结果是double
,因此最终结果prod*1/n
也是double(这是正确的结果)
答案就在你的声明中:1和n是整数,而prod是一个浮点数,prod=prod*1/n=prod/n的结果就是正确的浮点数。
而prod=prod*(1/n)将是prod*0(对于n>1),因为1/n是int/int,结果是int。
prod*1/n
被解析为(prod*1)/n
,并导致浮点除法
prod*(1/n)
使用一个整数除法,它将截断除法的结果(通常为0)。C从左到右操作,以便看到
prod = prod * 1 / N;
它认为prod等于prod除以1,再除以n。把括号放在1/N的周围,你告诉C prod是用1/N乘以的,而不是用另一种方式。这就像在数学中一样,如果你把要单独评估的东西放在括号里,然后在完成时放回顺序中 如果不使用paradensis,则将语句解析为
prod = (prod * 1) / n;
由于prod
是一个浮点数,proad*1
也将是一个浮点数。然后该除法将是浮点除法
但是,如果您添加parantase,那么(1/n)
将是整数除法,因为两个操作数都是整数。因此,(1/n)
对于n
>1将为零。然后,prod
也将为零
无论如何,您的程序调用未定义的行为,因为
prod
尚未初始化。您只需要一个循环。下面是我用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;
}
}
package math.series;
/**
*SeriesSum近似于e的值
*迈克尔创作的
*创建日期2016年2月20日。
*@linkhttps://stackoverflow.com/questions/35528818/parenthesis-effecting-the-output-in-c
*/
公开课系列{
公共静态final int DEFAULT_NUM_TERMS=5;
公共静态void main(字符串[]args){
int n=(args.length>0)?Integer.parseInt(args[0]):默认的\u NUM\u术语;
系统输出println(级数和(n));
}
公共静态双求和(int n){
双和=0.0;
双项=1.0;
对于(int i=1;i,原因是您的代码与相关的数学语句不相等。请记住,C中的/
不是除法,而是整数除法
它有效地将数学楼层函数添加到您的语句中。纯数学术语来说,您会发现:
Prod*floor(1/n)
与floor(Prod*1/n)
不同
您希望在代码中使用非括号版本:prod*1/n
但您还需要在每次迭代时将余数添加到总和中,因此:
Prod=(Prod/n)+(Prod%n);
请注意,这行代码中的括号纯粹是为了可读性,它不会更改计算
编辑:我认为在C语言中,如果/
运算符上的一个操作数是浮点,那么它将执行浮点除法。如果是这种情况,则不需要将余数加到和中:
Prod=Prod/n;
问题是整数除法:1/n=0表示n>1你在学校没有学过乘法/除法运算符的优先级吗?结果会有什么变化?(反对票不是我的)@Frankie_C;1/n
=0然后对答案进行澄清,因为你写的答案没有多大意义。@Frankie_C在这个答案中没有什么是没有意义的sense@DanielDowd1/n
为零,而不是n
为零
prod = (prod * 1) / n;
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;
}
}