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

我已经浏览了此代码,逻辑似乎是对的……但是我没有得到 任何 完全输出,甚至没有循环中的printfs。我(显然)是一个新手,试图从更高级别的语言中学习……您能告诉我出了什么问题吗?

#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, ,这不太正确。 :(

哇,我过度复杂化了。它现在起作用。谢谢大家。

有帮助吗?

解决方案

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

有可能 floor(sc) 总是很不满意 sc. 。因为SC是双重的,因此对其进行操作将引入小错误。尝试定义一个小变量以表示“足够接近”,并检查它是否在该范围内。看 这里 围绕此策略。

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

其他提示

不要使用 == 或者 !=. 。浮点号可以在您身上播放各种技巧。相反,尝试检查是否 sc 在整数附近的某些范围很小,您将有更好的运气。

项目Euler问题#9不需要方形根或漂浮。

当内循环的第一个通过中的第一个通过(因为√5不是整数)中的值'a = 1','b = 2'时,循环又回复了,'a = 1'和'b = 3',并且失败,因为√10不是整数,实际上,除了零(从循环中排除在外)以外,没有其他值的值2 + 12)本身就是一个整数。

因此,直到您用完了可分开的单独整数值的范围,您的代码将继续运行。

与“通过”和条件有关的代码 if(b>=c) break; (甚至更)if( (a-- + b-- + c) == 7) pass=1; 完全难以理解。更清楚地将代码重写。我什至不会尝试猜测那做什么。我想它旨在限制范围,以使“ A + B + C”不大于7或其他范围,但我认为它不会实现所需的效果 - 即使您必须执行它。

引用项目Euler页面,您打算找到一个毕达哥拉斯的三胞胎'a,b,c',这样“ a <b <c”和“ a + b + c = 1000”。 1000因子未出现在您的程序中。给定A和B的值,确定C的相关值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top