代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken Stephen Chung

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

  •  2
  • Aaron Yodaiken Stephen Chung  · 技术社区  · 14 年前

    我想解决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由于某种原因永远不会超过2,使它无限循环。

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

    哇,我太复杂了。现在可以了。谢谢大家。

    4 回复  |  直到 9 年前
        1
  •  2
  •   Community noseratio    7 年前
    if(floor(sc) != sc) continue; // we only want integer values of c
    

    有可能 floor(sc) 总是不适合 sc here

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

        2
  •  3
  •   Carl Norum    14 年前

    不使用比较浮点值 == != sc 在某个适当的小范围内接近整数,你会有更好的运气。

        3
  •  2
  •   msw    14 年前

    欧拉投影问题#9不需要平方根,也不需要浮点数。

        4
  •  1
  •   Jonathan Leffler Toon Krijthe    14 年前

    当内部循环的第一个过程中的值'a=1'、'b=2'失败时(因为5不是整数),循环会再次循环,返回'a=1'和'b=3',失败的原因是10不是整数,而且,实际上,除了零(从循环中排除)之外,没有其他N的值 2 + 1 2

    因此,直到您超出了单独整数值可分离的范围,您的代码才会继续运行。

    与“通过”和条件相关的代码 if(b>=c) break; 而且(更是如此) if( (a-- + b-- + c) == 7) pass=1; 完全无法理解。把代码重写得更清楚些。我甚至不想试着去猜那是怎么回事;我想它的目的是限制范围,使‘a+b+c’不大于7,或约为7,但我认为它不会达到预期的效果——即使你必须执行它。