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

上記の回答に追加すると、合計が初期化されていません(ゼロに初期化します)。入力が0の場合、コードは機能しないと思います(ゼロ除算エラーが発生します)。だから、whileまたはforループを使用するか、 do while の代替。

于 2013-08-14T12:13:17.973 に答える
2

私が見ることができる3つのエラー:

  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。モジュロ演算は 1 回だけ行います (その後、符号はprefix変化し続けます)。また、数値を入力するプロンプトを追加して (「なぜ何もしないの?!」)、結果に注釈を付けて (「数値だけ」を出力するのではなく)、終了することも常に良い考えです。改行で出力します (プロンプトがプログラムの出力を不明瞭にしないようにします)。

最後に、ユーザーが負の数を入力していないことを確認したい場合があります。これにより、コードが悪い結果を出す可能性があります。

後付けとして、 の大きな値をテストしてn、 を返すことができますlog(2.0)。しかし、それ不正行為です...そして、このシリーズは非常にゆっくりと収束します(非常にひどく振動します-n=1000の場合、3桁目はまだ変化しています)。その結果、丸め誤差は実際に悪化するリスクがあります。doubleこれが、タイプを使用する必要がある理由です。しかし、他の計算方法を検討することは有益であることをお勧めlog(2.0)ます。実際にそれらすべてを実装し、n 項の後でそれらの精度を比較することができます (エラー: を出力することによりsum - log(2.0))。

于 2013-08-14T12:07:20.303 に答える