我做了一个程序,返回产品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)
只是为了它的价值,我会写这个函数:
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)
在这种情况下,中断只会突破c循环,而不是b和循环a.
快速修复是通过启动大于或等于之前的每个变量来确保不会重复(因此b永远不会小于a且c永远不会小于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)