-3

私は完全な初心者です。SharpDevelop で小さな C# プログラムを作成しました。ここにあります:

double i, j;

for(i=1; i<=30; i+=(1/60))
{
    for(j=1+1/60; j<=30; j+=(1/60))
    {
        if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001)
        {
            Console.WriteLine("ln("+i+")   ln("+j+")");
        }
    }
}

        Console.ReadKey(true);

私のプログラムは、(たとえば)とがそれぞれとに等しく、とが正の整数であるijを見つけることになっています。( typeの代わりに typeを使用できることはわかっていますが、 type で機能させたいと考えています。)ln(i)/ln(j)=0.63092975357ijn/60m/60nmintdoubledouble

しかし、うまくいきません。「プロジェクトの実行」をクリックすると、黒い画面がポップアップしますが、何も起こりません...また、SharpDevelopはエラーを指摘しません...

それで、私はどんな間違いをしましたか?そして、私のプログラムを修正する方法は?

4

4 に答える 4

4

整数除算。

1/60 = 0

1 / 60.0d代わりに必要です。

整数で割ると、整数の結果が得られます。整数は小数を格納できません。

やっ1/60てる時は期待してます0.0166666666666667が実は0です。

このコードは動作するようになりました

double i, j;

for(i=1; i<=30; i+=(1/60d))
{
  for(j=1+1/60d; j<=30; j+=(1/60d))
  {
      if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001) 
          Console.WriteLine("ln("+i+")   ln("+j+")"); 
  }
}

編集: *おそらく言及する価値があります。書き込み60dにより、60 が double 型であることが保証されます。したがって、除算は double * を返すようになりました

于 2014-10-24T06:41:36.150 に答える
1

ここで見られる間違いは、0.0166 を表す double であると期待して 1/60 を使用していることです... 1 と 60 の両方が整数であり、これが整数除算になるため、実際には 0 です。1.0/60.0、1/60.0 または 1.0/60、1/60d、またはこれらの任意の組み合わせを使用してみてください。アルゴリズムが数学的に正しいと仮定すると、問題が解決するはずです。

これを修正すると、すでに大量のデータを出力している可能性があるにもかかわらず、ループが終了するまでプログラムが終了しないため、結果を出力する多数の行が表示されるようになる場合があります。フラグ変数 (bool) を追加して外側のループbreakを終了し、内側のループを終了することで修正できます。

于 2014-10-24T06:40:58.103 に答える
0

1 / 60整数除算を実行0し、結果として常に生成されます。小数部は常に破棄されます。

From /Operator (C# リファレンス)

2 つの整数を除算すると、結果は常に整数になります。たとえば、7 / 3 の結果は 2 です。

そのため、最初の for ループは次のようになります。

for(i = 1; i <= 30; i += 0)

i決して増加しないため、増加することはありません。そのため、これにより無限ループ30が生成されます。

解決策として、代わりに浮動小数点除算を使用する必要があります。

for(i = 1; i <= 30; i += (1 / 60f))
{
    for(j = 1+1/60f; j <= 30; j += (1 / 60))

それに加えて、Eric Lippert のHow to debug small programsを読むことをお勧めします。ここで尋ねなくても、コードのどこが間違っているかを簡単に見つけることができます。

于 2014-10-24T06:46:03.880 に答える