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 は正しくインクリメントされていました。合計は 1 になり続けました。

4

6 に答える 6

4

2 つの問題: 1 つは退屈で、もう 1 つは興味深いものです。

1)1 / xは不正確になります。1 と x は両方とも整数型であり、計算は整数演算で行われるからです。キャストが行うのは、結果の整数型を浮動小数点に変換することだけです。これを解決するには、次のように記述し1.0 / xます。次に、「x」は除算の前に浮動小数点に昇格されます。

2)ループの順序を逆にする必要がありforます:

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

(また、型の式であるが型の式であるため、初期化またはsumfor ループから移動しましたが、データ型が異なるため、コンマ演算子を使用しないでください。)sum = 0floatx = bint

理由は微妙です。同様の大きさの浮動小数点のみを追加する必要があります。ループを私のやり方で行うということは、小さい値が最初に追加されることを意味します。

の値が高いと効果が顕著になりますb。それを試してみてください。あなたの元の方法は、常に合計を過小評価します。

于 2013-06-27T12:57:50.400 に答える