用c计算毕达哥拉斯三胞胎

时间:2010-06-22 00:56:51

标签: c pythagorean

我正在尝试解决Project Euler#9,即http://projecteuler.net/index.php?section=problems&id=9

我查看了这段代码,逻辑似乎正确......但我根本没有得到任何输出,甚至连循环中的printfs也没有。我(显然)是一个C新手,试图从更高级别的语言中学习......你能告诉我出了什么问题吗?

#include <stdio.h>

int main(){
    unsigned int a=0, b=0, c=0;
    short int pass=0;
    while(!pass){
        //printf("a = %4d\n", a);
        a++;
        b=a;
        while(!pass){
            b++;
            c=1000-a-b;
            if(b>=c) break;
            if(a*a+b*b==c*c) pass = 1;
        }
    }
    printf("a=%d, b=%d, c=%d, a*b*c=%d, a+b+c=%d\n", a, b, c, a*b*c,a+b+c);
    return 1;
}

非常感谢。

编辑:好的,我已经修复了浮点问题,如上所示,但现在由于某种原因从未超过两个,使其无限循环。

编辑:我修复了一些错误,但仍然会返回a=33, b=483, c=484, a*b*c=7714476, a+b+c=1000,这不太对。 :(

哇,我太复杂了。它现在有效。谢谢大家。

4 个答案:

答案 0 :(得分:3)

请勿使用==!=比较浮点值。浮点数可以在你身上发挥各种技巧。相反,请尝试检查sc是否在整数附近的某个适当的小范围内,您将获得更好的运气。

答案 1 :(得分:2)

if(floor(sc) != sc) continue; // we only want integer values of c

floor(sc)可能永远是sc的遗传。因为sc是double,所以对它的操作会引入小错误。尝试定义一个小变量来表示“足够接近”并检查它是否在该范围内。有关此问题的策略,请参阅here

不确定您的代码是否存在其他问题。

答案 2 :(得分:2)

项目欧拉问题#9不需要平方根也不需要浮点数。

答案 3 :(得分:1)

当内部循环的第一遍中的值'a = 1','b = 2'失败时(因为√5不是整数),循环再次出现,'a = 1'并且'b = 3',并且因为√10不是整数而失败,实际上,除了零(从你的循环中排除)之外没有N的值,其中√(N 2 + 1 2 )本身就是一个整数。

因此,在超出可分离单独整数值的范围之前,您的代码将继续运行。

与'pass'相关的代码和条件if(b>=c) break;以及(甚至更多) if( (a-- + b-- + c) == 7) pass=1;完全是不可理解的。在那里更清楚地重写代码。我甚至都不会去猜测那是做什么的;我想它的目的是限制范围,使'a + b + c'不大于7或其左右,但我不认为它会达到预期的效果 - 即使你必须执行它。 / p>

参考Project Euler页面,你的意思是找到一个毕达哥拉斯三元组'a,b,c',这样'a&lt; b&lt; c'和'a + b + c = 1000'。因子1000不会出现在您的程序中。给定a和b的值,确定c的相关值。