0

我这里有一个程序应该总结系列 1+1/2+1/3+1/4... 等

唯一的用户条目是输入您希望此总和运行多少次。但是,我一直得到总和。

#include <stdio.h>

int main(void)
    {
        int b,x; /* b is number of times program runs and x is the count*/
        float sum;
        printf("Enter the number of times you want series to run.\n");
        scanf("%d", &b);
        printf("x     sum\n");

        for(x=1,sum=0;x<b+1;x++)
        {
          printf("%d %9.3f\n",x, (sum +=(float)(1/x)));
        }
        return 0;

    }

我不太明白为什么它不起作用。正如你所看到的,我确实告诉它打印 x 并且当它打印时,x 正确递增。总和只是不断加起来。

4

6 回答 6

4

您放错了括号,因此您正在1/x对 x > 1 的任何值进行整数除法并得到 0。

我建议你改变:

      printf("%d %9.3f\n",x, (sum +=(float)(1/x)));

至:

      printf("%d %9.3f\n",x, (sum += 1.0f/x));
于 2013-06-27T12:54:06.523 回答
4

两个问题:一个沉闷,一个有趣。

1)1 / x将是不精确的,因为 1 和 x 都是整数类型,因此计算将在整数算术中完成。强制转换所做的只是将得到的整数类型转换为浮点数。要解决此问题,请编写1.0 / x. 然后在除法之前将“x”提升为浮点数。

2)你应该颠倒for循环的顺序:

 sum = 0.0;
 for(x = b; x >= 1; --x)

(我也将初始化或sum从 for 循环中移出,因为sum = 0它是一个类型的表达式,floatx = b它是一个类型的表达式,int因此您不应该使用逗号运算符,因为它们具有不同的数据类型。)

原因很微妙:您应该只添加相似大小的浮点数。以我的方式循环意味着首先添加较小的值。

b对于;的高值,效果会很明显。试试看。你原来的方式总是会低估总和。

于 2013-06-27T12:57:50.400 回答
3

问题是整数除法1/x,只要x大于 1,它总是会导致 0。即使您稍后将其转换为 a float,“损坏”已经完成。一个简单的解决方法是将除法更改为1.0f/x.

于 2013-06-27T12:54:10.150 回答
1

由于您已将 x 声明为 int,因此 (1/x) 在 x 为 1 时返回 1,在 x>1 时返回 0。所以,总和仍然是 1。所以你得到相同的结果。

因此,更改(1/x)1.0f/x, 以将结果作为浮点数返回

于 2013-06-27T12:55:54.853 回答
1

在这里,您正在计算1/x截断小数值。在原始值被截断后将其转换为浮点数是没有意义的。

因此,将其更改为:-

printf("%d %9.3f\n",x, (sum +=(float)(1/x)));

printf("%d %9.3f\n",x, (sum += 1.0f/x));
于 2013-06-27T12:56:26.067 回答
0

表达式(1/x)将始终是整数除法。对于第一次运行,这将为1/1您提供 1。但是,下一轮它将1/2是 0。基本上对于1/xx>1 的位置,答案将为零。

为了解决这个问题,写下表达式 as 1.0/xwhich will cause xto be Promotion to a double,给你双除法。

于 2013-06-27T12:56:42.320 回答