您好,您可以快速浏览一下我的代码并指出错误。 我试图计算这样的n个数的总和:1- 1/2 + 1/3 - 1/4 ......等......
使用以下代码,我每次得到1.00000,但它应该在0和1之间,例如对于3,它应该是1 - 1/2 + 1/3 = 0,83333。
#include <stdio.h>
int main () {
int n, prefix;
float sum;
scanf("%d", &n);
do {
if (n%2==0) {
prefix=-1;
} else {
prefix=1;
}
sum+= prefix/n;
n = n - 1;
} while (n > 0);
printf("%f", sum);
}
答案 0 :(得分:2)
我可以看到三个错误:
premix
vs prefix
)sum
请尝试以下方法:
#include <stdio.h>
int main () {
int n, n_initial;
double sum=0.0, prefix = 1.0;
printf("enter the value for n:\n");
scanf("%d", &n);
if(n<1) {
printf("n must be > 0!\n");
return 1;
}
n_initial = n;
if (n%2==0) prefix = -1.0; else prefix= 1.0;
do {
sum+= prefix/(double)n;
prefix *= -1.0;
n--;
} while (n > 0);
printf("The sum of the series over %d terms is: %lf\n", n_initial, sum);
return 0;
}
注意 - 我将n
保留为整数,并在分割之前明确地将其强制转换。将它设置为float / double可能更好 - 记得相应地更改scanf
的格式规范。我只进行一次模运算(之后,prefix
的符号不断变化)。此外 - 添加一个数字输入的提示(“为什么不做任何事情?!”)总是一个好主意,要注释结果(而不是打印“只是一个数字”),并结束使用换行符输出(因此提示不会遮挡程序的输出)。
最后 - 您可能想要检查用户是否输入了否定号,这会使您的代码产生错误结果。
作为事后的想法 - 您可以测试n
的大值,然后返回log(2.0)
。但会作弊......而且这个系列会慢慢收敛非常(它振荡得非常严重 - 当n = 1000时,第3位仍在变化)。因此,舍入错误的风险确实很复杂。这就是您需要使用double
类型的原因;但我建议查看计算log(2.0)
的其他方法是有益的 - 例如,使用http://www.math.com/tables/expansion/log.htm给出的其他系列之一。您可以实际实现所有这些,并在n个术语后比较它们的准确性(通过打印错误:sum - log(2.0)
。)
答案 1 :(得分:2)
添加上述答案后,您未初始化总和(将其初始化为零)。我认为当输入为时,您的代码无法正常工作0(它给出除以零的误差)。更好地使用while或for循环或者在do while中提出替代方法。
答案 2 :(得分:1)
当两者都是整数时,你正在做prefix/n
。所以你得到的答案是整数(总是0)
使用
(double)prefix/n
或
prefix/(double)n
甚至
(double)prefix/(double)n
这是完整的代码:
#include <stdio.h>
int main () {
int n, prefix;
float sum = 0;
scanf("%d", &n);
do {
if (n%2==0) {
prefix=-1;
} else {
prefix=1;
}
sum+= (double)prefix/(double)n;
n = n - 1;
} while (n > 0);
printf("%f", sum);
}
我在compileonline.com上运行它,输入为10并得到:
答案 3 :(得分:0)
prefix
和n
都是整数,这意味着您将使用整数除法来截断结果(即简单地删除小数)。如果需要浮点结果,则一个或两个变量也必须是浮点变量。