【问题标题】:computing Pythagorean triplets with c用 c 计算毕达哥拉斯三元组
【发布时间】:2010-06-22 00:56:50
【问题描述】:

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

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

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

【问题讨论】:

  • 您选择 0.01 作为容差是任意的 - 并且是可疑的。但是,它也与值(a=33,b=483,c=484)没有明确的关系,因为 √(33² + 483²) 约为 484.126。出于速度和准确性的原因,您确实需要消除使用“sqrt()”。
  • 你应该打印出 'aa+bb' 和 'c*c'。
  • 您的代码第一次达到“if (a + b + c == 1000)”条件时,它会退出两个循环,即使未达到毕达哥拉斯条件也是如此。 REWRITE - 使用 while 循环的方法存在缺陷且不必要地复杂。

标签: c pythagorean


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    if(floor(sc) != sc) continue; // we only want integer values of c
    

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

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

    【讨论】:

    • 好的,有道理。有没有更好的方法来检查 float/double 是否没有 float_equality(floor(double), double) 技术的小数部分?
    • @aharon:你只需要使用整数算术。给定 a 和 b 的值,c 的值由问题控制(a + b + c = 1000)。您只需要检查是否 aa + bb = c*c。在我相当普通的 Mac 上使用最简单的双嵌套 for 循环需要一分一秒的时间才能得出答案。正如 Project Euler 问题所述,无需一秒钟即可验证答案是否只有一个。
    【解决方案3】:

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

    【讨论】:

    • 或大于 32 位的整数。
    【解决方案4】:

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

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

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

    参考 Project Euler 页面,您应该找到一个毕达哥拉斯三元组 'a, b, c' 使得 'a

    【讨论】:

    • 是的,很抱歉——这是一个错误的修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多