为什么答案打印两次?

rEg*_*icS 2 c++

我做了一个程序,返回产品a b c,其中a,b,c是毕达哥拉斯三元组,加起来为1000.程序确实输出了正确的答案但是两次.我很好奇为什么会这样.稍微玩了一下之后,我发现当a = 200 b = 375 c = 425时打印出来.再次当a = 375 b = 200 c = 425时.

bool isPythagTriple(int a, int b, int c);

int main()
{

    for(int a = 1; a < 1000; a++)
    {
        for(int b = 1; b < 1000; b++)
        {
            for(int c = 1; c < 1000; c++)
            {
                if( ((a+b+c)==1000) && isPythagTriple(a,b,c) )
                {
                    cout << a*b*c << " ";
                    break;
                }
            }
        }
    }

    return 0;
}

bool isPythagTriple(int a, int b, int c)
{
    if( (a*a)+(b*b)-(c*c) == 0 )
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 9

只是为了它的价值,我会写这个函数:

bool isPythagTriple(int a, int b, int c)
{
    if( (a*a)+(b*b)-(c*c) == 0 )
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

更像是这样的:

bool isPythagTriple(int a, int b, int c) { 
    return a*a+b*b==c*c;
}
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 8

在这种情况下,中断只会突破c循环,而不是b和循环a.

快速修复是通过启动大于或等于之前的每个变量来确保不会重复(因此b永远不会小于ac永远不会小于b).

另外,你实际上可以c完全摆脱循环,因为只有一个值c对于给定的a,b对是有效的(除非a + b + c > 1000在这种情况下没有).我会尝试类似的东西:

for (int a = 1; a < 1000; a++) {
    for (int b = a; b < 1000; b++) {
        int c = 1000 - a - b;
        if (c >= b) {
            if (isPythagTriple (a,b,c)) {
                cout << a << " " << b << " " << c << " " << a*b*c << std::endl;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的总体效果是将总循环次数从十亿(短规模)减少到大约五十万,从而减少了大约99.95% - 这应该会快一点:-)


并且可能通过Jerry Coffin的建议(以及对编译器的内联建议)使其更快,一个完整的程序:

#include <iostream>

inline bool isPythagTriple(int a, int b, int c) {
    return a * a + b * b == c * c;
}

int main() {
    for(int a = 1; a < 1000; a++) {
        for(int b = a; b < 1000; b++) {
            int c = 1000 - a - b;
            if (c >= b) {
                if (isPythagTriple(a,b,c)) {
                    std::cout << a << " " << b << " " << c << " "
                        << a*b*c << std::endl;
                }
            }
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的盒子上平均花费0.004秒(系统+用户),原始平均花费约2.772秒(每个十个样本).当然,除非你运行很多次,否则它并不重要.

正如预期的那样,该代码的输出是:

200 375 425 31875000
Run Code Online (Sandbox Code Playgroud)