1

Hello could you take a quick glance at my code and point out the mistake(s). I'm trying to calculate sum of n numbers going like this: 1- 1/2 + 1/3 - 1/4 ... etc...

With the following code, I get 1.00000 each time, but it should be between 0 and 1, for example for 3 it should be 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);

}
4

4 回答 4

2

我可以看到三个错误:

  1. 错字(premixvs prefix
  2. 整数类型的使用
  3. (感谢@Light):初始化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 时,第三位数字仍在变化)。因此,舍入错误的风险真的很复杂。这就是您需要使用该double类型的原因;但我建议查看其他计算方法是有益log(2.0)的 - 例如,使用http://www.math.com/tables/expansion/log.htm中给出的其他系列之一。您实际上可以实现所有这些,并在 n 项之后比较它们的准确性(通过打印错误:sum - log(2.0).)

于 2013-08-14T12:07:20.303 回答
2

添加到上面的答案中,您有未初始化的总和(将其初始化为零)。我认为您的代码在输入为 0 时不起作用(它给出除以零错误)。所以最好使用 while 或 for 循环或想出一个在做的时候替代。

于 2013-08-14T12:13:17.973 回答
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 并得到:

在此处输入图像描述

于 2013-08-14T12:04:44.950 回答
0

prefix和都是n整数,因此这意味着您将进行整数除法,从而截断结果(即简单地截断小数)。如果您想要浮点结果,则其中一个或两个变量也必须是浮点变量。

于 2013-08-14T12:04:34.903 回答