2

次の式を計算して表示するプログラムを作成する必要があります。

P=(1/2-3/4)*(5/6-7/8)*...*[n/(n-1) - (n+2)/(n+3)]

これを実行して実行しましたが、エラーは表示されません。実行すると、入力するすべての値に対して P=0 と表示されます。なにが問題ですか?

#include <stdio.h>

int main (void)
{
    float s, p=1.0;
    int i, n;
    printf("Enter a number:");
    scanf("%d", &n);
    for (i=1;i<=n;++i) { 
        p*=((i)/(i+1)-(i+2)/(i+3));
    }
    printf("p=%f\n", p);
}
4

4 に答える 4

6

浮動小数点ではなく整数演算を使用しているため、除算演算が切り捨てられています。

変化する:

p*=((i)/(i+1)-(i+2)/(i+3));

に:

p*=((float)(i)/(i+1)-(float)(i+2)/(i+3));
于 2013-04-26T15:12:45.217 に答える
2

iが整数であるため、機能していません。(i)/(i+1)またはを除算(i+2)/(i+3)すると、どちらの場合もゼロになりますi。 が正の場合、分母は分子よりも大きいためです。ゼロマイナスゼロはゼロ、ゼロp倍はゼロなので、それが得られます。

この問題を解決するには、次のように宣言ifloatます。

#include <stdio.h>
int main ()
{
    float s,p=1.0, i;
    int n;
    printf("Put a number:");
    scanf("%d",&n);
    for (i=1;i<=n;++i) { 
        p*=((i)/(i+1)-(i+2)/(i+3));
    }
    printf("\n p=%f",p);
    return 0;
}
于 2013-04-26T15:12:53.727 に答える
2

int変数ではなくfloat変数を使用しているため、整数除算であるため、i/(i+1)常に(i+2)/(i+3)評価されます。0

いくつかのキャストを使用して、浮動小数点演算を使用して評価を強制するだけです。

((float)i)/(i+1)-((float)i+2)/(i+3)
于 2013-04-26T15:12:59.430 に答える
1

問題は、探しているように見える浮動小数点の結果を返すのではなく、整数除算が切り捨てられることです。

 i/(i+1)

 (i+2)/(i+3)

は常に0C です。

于 2013-04-26T15:12:47.170 に答える