0

私はこの問題を解決したいと思っています。私は JavaScript を他のどの言語よりもよく知っているので、最初は JavaScript で書き、現在は C に翻訳しようとしています。

サンプル画像

これは私のJavaScriptコードです

var SUM=0,RES=1,n=prompt('Enter n'),i=1,j=1;
for(var i=1;i<=n;i++){

  SUM = 0;

  for(var j=1;j<=i;j++){

    SUM = SUM+ i/(2*j);

  }
  RES = RES * SUM
}
console.log(RES)

これはうまくいっていると思います。私はそれをCに翻訳し、結果は次のとおりです。

#include "stdio.h"

int main(void) 
{
   int n,i,j;
   float SUM=0,RES=1;
   printf("n equals to ");
   scanf("%d", &n); 

    for(i=1;i<=n;i++){
        SUM = 0;

        for(j=1;j<=i;j++){

            SUM = SUM + i/(2*j);

        }
        RES = RES * SUM;
    }
   return RES;
}

JavaScript は少なくとも数値を返します。C コードは常に 0 を返します。どこに問題がありますか?

4

2 に答える 2

3

整数除算にだまされた (非常によくある問題)! 1 行を次のように変更した場合:

SUM = SUM + (float)i/(2*j);

その理由は、整数除算の結果が別の整数になるためです。だからいつでも

i/2*j < 1 (for positive integers)

あなたの結果は 0 に切り捨てられます。あなたの場合、その不等式は常に真であるため、たくさんのゼロを足しているだけです。最初に i を float にキャストしてから、除算して double の結果を得るだけです。

于 2013-10-27T13:35:59.660 に答える
2

コメントに記載されているように、この行で整数除算を行っています

 SUM = SUM + i/(2*j);

これは整数の結果を返します (floor 関数を使用する場合と同様)。

1/(2*j) の暗黙の変数を float または double に変換する必要があります。

integer/float は float であり、integer/integer は整数を返します。

浮動小数点数×整数は浮動小数点数です。

SUM = SUM + i/(2.0f*j); 

分母を浮動小数点数に変換することで問題を解決する必要があります。

于 2013-10-27T13:37:38.217 に答える