goto を使うのは 2 つのループから抜け出す正当な方法ですか? 質問する

goto を使うのは 2 つのループから抜け出す正当な方法ですか? 質問する

私は問題9を解いていますプロジェクト オイラー私の解決策では、2 つの for ループから抜け出すために「goto」ステートメントを使用します。問題は次のとおりです。

ピタゴラスの三つ組は三つの自然数abcの集合であり、

a^2 + b^2 = c^2

たとえば、3^2 + 4^2 = 9 + 16 = 25 = 52 です。

a + b + c = 1000 となるピタゴラスの三つ組は 1 つだけ存在します。積 abc を求めます。

私の解決策は C++ です:

int a,b,c;
const int sum = 1000;
int result = -1;
for (a = 1; a<sum; a++){
    for (b = 1; b < sum; b++){
            c = sum-a-b;
            if (a*a+b*b == c*c){
                result = a*b*c;
                goto found;
            }
    }   
}
found:
std::cout << "a:" << a << std::endl;
std::cout << "b:" << b << std::endl;
std::cout << "c:" << c << std::endl;
std::cout <<"Result:" << result << std::endl;

「goto」ステートメントは C++ プログラマーの間ではあまり人気がないので、これが「goto」の妥当な使用法と考えられるかどうか、または「goto」を必要としない問題に対するよりよい解決策があるかどうかを知りたいと思います。ここで私が言っているのは、「goto」を回避するだけの解決策ではなく、アルゴリズムを改善する方法で「goto」を回避する解決策です。

ベストアンサー1

returngotoこれは多くのプログラマーにとってより受け入れやすい「構造化」です。つまり:

static int findit(int sum, int* pa, int* pb, int* pc)
{
    for (int a = 1; a<sum; a++) {
        for (int b = 1; b < sum; b++) {
            int c = sum-a-b;
            if (a*a+b*b == c*c) {
                *pa = a; *pb = b; *pc = c;
                return a*b*c;
        }
    }
    return -1;    
}

int main() {
    int a, b, c;
    const int sum = 1000;
    int result = findit(sum, &a, &b, &c);
    if (result == -1) {
        std::cout << "No result!" << std::endl;
        return 1;
    }
    std::cout << "a:" << a << std::endl;
    std::cout << "b:" << b << std::endl;
    std::cout << "c:" << c << std::endl;
    std::cout <<"Result:" << result << std::endl;
    return 0;
}

おすすめ記事