В этом случае
break будет разрываться только из цикла c
, а не из b
и a
.
Быстрое решение состоит в том, чтобы гарантировать, что вы не получите повторы, начиная каждую переменную больше или равную предыдущей (так что b
никогда не меньше a
и c
никогда не меньше b
) .
Кроме того, вы можете вообще избавиться от цикла c
, поскольку для данной пары a,b
действует только одно значение c
(если только 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% - что должно быть чуть-чуть быстрее: -)
И, возможно, ускорение благодаря предложению Джерри Коффина (и встроенному предложению компилятору), полной программе:
#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