1

これが質問です

side1、side2、および斜辺のすべてのピタゴラス トリプルをすべて 500 以内で見つけます。

以下は私の試みです

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int side1 = 0;
    int side2 = 0;
    int rightSide = 0;

    cout << "Right Side" << setw(10) << "Side1" << setw(10) << "Side2" << endl;

    for(int i=1;i<=500;i++)
    {
        side1++;
        //cout << side1 << endl;

        for(int a=1;a<=500;a++)
        {
            side2++;
            //cout << "side 2 " << side2 << endl;

            for(int c=1;c<=500;c++)
            {
                rightSide++;
                int rightSideSqr = rightSide*rightSide;
                int side1Sqr = side1*side1;
                int side2Sqr = side2*side2;

                if(rightSideSqr == side1Sqr+side2Sqr)
                {
                    cout << rightSideSqr << setw(15) << side1 << setw(10) << side2 << endl;
                 }


            }
        }
    }
}

しかし、それは成功しません。無限ループのようです。助けてください。

注意してください:私はC ++を初めて使用します。独学で勉強しています。そして、これは宿題ではありません。問題を表現する最良の方法であるため、問題ステートメントを作成しました。

編集

右側 Side1 Side2

RUN SUCCESSFUL (合計時間: 1 秒)

編集2

作業コード

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    //int side1 = 0;
    //int side2 = 0;
    //int rightSide = 0;

    cout << "Right Side" << setw(10) << "Side1" << setw(10) << "Side2" << endl;

    for(int i=1;i<=500;i++)
    {
        //side1++;
        //cout << side1 << endl;

        for(int a=1;a<=500;a++)
        {
            //side2++;
            //cout << "side 2 " << side2 << endl;

            for(int c=1;c<=500;c++)
            {
                //rightSide++;
                int rightSideSqr = c*c;
                int side1Sqr = i*i;
                int side2Sqr = a*a;

                if(rightSideSqr == (side1Sqr+side2Sqr))
                {
                    cout << rightSideSqr << setw(15) << i << setw(10) << a << endl;
                 }


            }
        }
    }
}
4

2 に答える 2

3

これは無限ループではなく、非常に遅い有限ループです。I/O が遅い -- 中間ループのステートメントで 500*500 = 250,000 行のテキストをcout出力しており、コンソールへの 250,000 行のテキストの出力は非常に遅いです。その print ステートメントを削除すると、はるかに高速に実行されます。

次に、ロジックにエラーがあります。変数side1side2、およびrightSideは適切なタイミングで 0 にリセットされることはないため、意図した値を超えて増加し続けます。それらを 0 にリセットしてみるか、そのような余分な変数の代わりにループ カウンターを使用してください。

于 2012-09-19T17:45:56.800 に答える
1

@Adam Rosenfieldが指摘した問題以外にも。制限を少し高くすると、プログラムはそのような 3 つのループで速く終了しません。

最初の観察は、斜辺を計算して比較できるため、3 番目の内部ループは必要ないということです。2辺から斜辺を計算して整数化し、ピタゴラスの等式が成り立つかどうかを調べます。

いくつかの観察を行うことができます: 2 つの側面は交換可能であるため、sqrt(500 2 /2) までループするだけで済みます (上に行くと、側面が反転するだけです)。直角三角形の反対側の 2 番目の内側のループは、上限がわかっているので、sqrt(500 2 - side1 2 ) までループすることでループの数を減らすことができます。

Cコードではなく疑似コード(^CコードではXORですが、^以下の疑似コードでは電力を表すために使用しています)。round()最も近い整数に丸められます (これを実装する必要があるかもしれません)。2 つのループの上限は、ループ中に値が変更されないため、ループに入る直前にキャッシュできます。

for (side1 = 1; side1 <= round(sqrt(500^2 / 2)); side1++) {
    for (side2 = side1; side2 <= round(sqrt(500^2 - i^2)); side2++) {
        hypo = round(sqrt(side1^2 + side2^2))

        if (hypo^2 == side1^2 + side2^2) {
           printResult
        }
    }
}
于 2012-09-19T18:01:44.127 に答える