以下是我对Project Euler #9的回答,这似乎在逻辑上是正确的,但未能正确评估:
#include <stdio.h>
#include <math.h>
int main(){
int a=0,b=0,c=0,a1=0,b1=0,c1=0,product=0;
bool cond = false;
for (a=1;cond==false && a<334;a++){
for (b=a;(a+b)<500;b++){
c = 1000-a-b;
if (a*a + b*b == c*c){
cond = true;
product = a*b*c;
a1 = a;
b1 = b;
c1 = c;
break;
}
}
}
printf("Triple has constituents (%d, %d, %d) with product %d.",a1,b1,c1,product);
return 0;
}
我用其他C系列解决方案检查了这个问题,它在逻辑方面完全相同,但总是输出(0,0,0)而不是真正的三元组。为什么是这样?我认为它与if语句有关,但我不确定,也不能发现它有什么问题。
(我很清楚我可能会忽略一些简单的事情,如果是这样的话,我会在得到答案后删除这个问题。)
答案 0 :(得分:2)
正如其他人所说,你需要解决的唯一问题就是这一行:
for (b=a;b<500;b++){
这是一个解决方案。
a 2 + b 2 =(s - a - b) 2
从条件
a < b < c
,我们得出结论a <= (s - 3) / 3
和b < (s - a) / 2
。
请注意s = 1000
,但我们在这里使用了幻数。
#include <stdio.h>
int main() {
int a,b,c;
for (a=1;a<333;a++) {
for (b=a+1;b<500;b++)
{
c=1000-a-b;
if (c>b) {
if (a*a+b*b==c*c)
printf("a=%d b=%d c=%d a*b*c=%d\n",a,b,c,a*b*c);
}
}
}
return 0;
}
答案 1 :(得分:1)
a + b
的限制太低了。例如,三元组(200,399,401)将永远不会被检查,因为c
将始终至少为500.总和的更好(和正确)限制为1000 - 333
。
答案 2 :(得分:0)
第二个for循环的限制检查出错,限制了您的解决方案范围。
多数民众赞成我会说