为什么这不能正确评估? (项目欧拉9 - C)

时间:2014-02-14 01:10:46

标签: c

以下是我对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语句有关,但我不确定,也不能发现它有什么问题。

(我很清楚我可能会忽略一些简单的事情,如果是这样的话,我会在得到答案后删除这个问题。)

3 个答案:

答案 0 :(得分:2)

正如其他人所说,你需要解决的唯一问题就是这一行:

for (b=a;b<500;b++){

这是一个解决方案。

  

a 2 + b 2 =(s - a - b) 2

     

从条件a < b < c,我们得出结论   a <= (s - 3) / 3b < (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循环的限制检查出错,限制了您的解决方案范围。

多数民众赞成我会说