C - 1 / n数的和

时间:2013-08-14 12:01:03

标签: c numbers sum

您好,您可以快速浏览一下我的代码并指出错误。 我试图计算这样的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);

}

4 个答案:

答案 0 :(得分:2)

我可以看到三个错误:

  1. 拼写错误(premix vs prefix
  2. 使用整数类型
  3. (感谢@Light):初始化sum
  4. 请尝试以下方法:

    #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并得到:

enter image description here

答案 3 :(得分:0)

prefixn都是整数,这意味着您将使用整数除法来截断结果(即简单地删除小数)。如果需要浮点结果,则一个或两个变量也必须是浮点变量。