0

100 の斜辺を持つ三角形を出力するだけのピタゴラスのトリプルのシーケンスから繰り返し三角形を除外しようとしていますが、除外部分で行うことは失敗します...次のものがあります:

....
    int one_hundred = 0,
     if( (a*a) + (b*b) == (h*h) ){

        //exclusion
        if((a == b)){

           continue;

        }else {

       //Just prints the the triangles that have hypotenuses of 100
      if(h == 100){
            cout <<  a << "     " << b << "     " << h << endl;

           }

      .....

     }

これで、出力は次のようになります。

繰り返しとは、最初と最後の行が同じセットの辺のペアを持っているということです

私がしたいのは、次のような出力です。

ここに画像の説明を入力

しかし、これは次のように行います。

// 繰り返しかどうかを調べる

if((a == 96)){

    continue;

    }

そして、 a == b を比較することで同じことを達成できると思いましたが、そうではありませんでした:

if((a == b)){

    continue;

    }

うまくいけば、これは私がやろうとしていることを明確にします...

ありがとうございました!!

4

3 に答える 3

3

ピタゴラストリプルのシーケンスから重複を除外することは非常に困難です。これは、膨大な数の比較のために、すべての古いトリプルを永続的に記憶する必要があるためです。

より良いアプローチは、最初から繰り返しを生成しないことです。これを行うには、次の一連の式を使用できます(ピタゴラストリプルに関するウィキペディアの記事の「トリプルの生成」セクションから)。

a = k・(m 2 - n 2
b = k・(2 mn
c = k・(m 2 + n 2

ここで、km、およびnは正の整数であり、mnは互いに素であり(最大公約数が1であることを意味します)、mまたはnのいずれかが偶数です。

于 2013-02-13T21:39:30.843 に答える
0

(if(abs(ab)<EPSILON))続行するのはどうですか...

また、最初のif構造で同じ不等式を使用します(どこかでEPSILONを定義します)。

Cコーディングを行ってからしばらく経ちましたが、倍精度または浮動小数点数が等しいと、間違った結果が得られていました。それらがすべて整数でない限り、その場合(a == b)は(b == a)と同じですが、なぜ両方があるのか​​わかりません。

于 2013-02-13T21:37:21.553 に答える
0

簡単なアプローチは、すべての側面の中で最大であるstd::vector<bool> state(h);ため、他の側面が決して大きくならないことを作成することだと思います。h右?そして、それ自体で乗算された他の数値は、それ自体で乗算された別の数値と等しくないことを知っています。そうでなければ、5*5 = 4*4のように言えます! したがって、ベクトルの添字を数値の代表として使用できます。数字を 1 つ取り出して、それが問題の解決策であることがわかったら、その状態を に切り替えるだけfalseです。全体はこのようになります -

bool loop;
std::vector<bool> *state = new std::vector<bool>(h, true);
for(int i = 2; i != sizeof(bool) * h; ++i)
{
    if((state + i))
    {
        a = i;
        loop = true;

        for(int j = i + 1; loop && j != sizeof(bool) * h; ++j)
        {
            if((state + j))
            {
                b = j;          

                if((a*a) + (b*b) == (h*h))
                {
                    loop = false;
                    (*state)[i] = false;                                                      
                    (*state)[j] = false;
                    std::cout << a << " " << b << " " << h << std::endl;
                }
            }
        }
    }
}

私の出力は次のとおりです。

28 96 100
60 80 100

これは、希望する結果の例であなたが意味したことだと思います。それ以外の場合は、特定のものを二重印刷するルールを作成する必要があります。その場合、 を追加できますswitch(){}。それほど難しくはありませんが、それほどエレガントではありません。

注: 実際には変更state->at(i)する必要falseはありませんi。ただし、後でサブを使用する必要がある場合に備えてあります。インデックス 0 と 1 は、三角形のどの辺も 0 にならないため無視されています。一方が実行可能な場合、もう一方の辺は等しくhなければならないため、貴重な時間を無駄にしないでください。true本当にそれらを保持している場合は、最初は 0 と 1であり、false に設定する必要があることを覚えておいてください。

于 2013-02-13T23:08:52.870 に答える