为什么答案打印两次?

时间:2010-05-10 03:25:20

标签: 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;
}

5 个答案:

答案 0 :(得分:9)

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

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

更像这样:

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

答案 1 :(得分:8)

在这种情况下,中断只会突破c循环,而不是ba循环。

快速解决方法是确保您不会通过启动大于或等于之前的每个变量来获得重复(因此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;
            }
        }
    }
}

总体效果是将总循环次数从十亿(短规模)减少到大约五十万,从而将其减少约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;
}

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

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

200 375 425 31875000

答案 2 :(得分:2)

这就是breakcontinue工作的方式 - break仅退出最内层循环。阅读讨论on this question,了解其中的一些替代方案。

答案 3 :(得分:0)

发生这种情况的原因是因为你只是打破了内循环(对于c)。外环继续运行并重新进入内环,再次满足条件。有许多值添加到1000并且您正在捕捉其中一些 - 您已经捕获了2,正如您的打印所示。如果您只想输出第一个值组合,则可以使用“return”而不是break。

至于“代码块”我不确定你的意思..你似乎已经知道要编写函数了。如果你的意思是一个范围块,那么你只需将关注的代码括在花括号中 - &gt; {}

E.g。

{    int i = 0;    我++; }

答案 4 :(得分:0)

要防止多个解决方案的排序,请确保c >= b >= a。您可以通过更改下限来执行此操作:

for(int a = 1; a < 1000; a++) {
        for(int b = a; b < 1000; b++) {
            for(int c = b; c < 1000; c++) {