2

我正在尝试解决 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 永远不会超过两个,使其无限循环。

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

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

4

4 回答 4

3

==不要使用or比较浮点值!=。浮点数可以对你玩各种花样。相反,尝试检查它sc是否在整数附近的某个适当的小范围内,你会有更好的运气。

于 2010-06-22T01:05:48.017 回答
2
if(floor(sc) != sc) continue; // we only want integer values of c

这可能floor(sc)总是不符合sc. 因为 sc 是一个双精度数,对它的操作会引入一些小错误。尝试定义一个小变量来表示“足够接近”并检查它是否在该范围内。有关此问题的策略,请参见此处

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

于 2010-06-22T01:04:55.103 回答
2

Project Euler 问题#9 不需要平方根也不需要浮点数。

于 2010-06-22T01:08:32.407 回答
1

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

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

与“通过”相关的代码和条件if(b>=c) break;以及(更是如此) if( (a-- + b-- + c) == 7) pass=1;是完全难以理解的。更清楚地重写那里的代码。我什至不会尝试猜测它的作用。我想它的目的是限制'a + b + c'不大于7或大约的范围,但我认为它不会达到预期的效果——即使你曾经执行过它。

参考 Project Euler 页面,您应该找到一个毕达哥拉斯三元组 'a, b, c' 使得 'a < b < c' 和 'a + b + c = 1000'。因子 1000 不会出现在您的程序中。给定 a 和 b 的值,确定 c 的相关值。

于 2010-06-22T01:15:23.420 回答