【问题标题】:Knuth's Art of Programming Third Edition and the Euclidean algorithm exampleKnuth's Art of Programming 第三版和欧几里得算法示例
【发布时间】:2015-08-18 06:32:03
【问题描述】:

我刚开始阅读 Knuth 的编程艺术的第 1 卷,并到达第 4 页上他描述欧几里得算法的部分。他陈述了求两个数的最大公约数的步骤。你可以在这里阅读更多信息https://en.wikipedia.org/wiki/Euclidean_algorithm

他逐步介绍了一个找到 199 和 544 的 GCD 的示例,他指出 17 作为答案。我很快实现了算法,只是为了跟随,但得到了答案 1。使用我的计算器,我也得到了答案 1。

我的代码是。

#import <math.h>
#import <stdio.h>

double GreatestComminDivisor(int m, int n) {

    double r = fmod(m, n);
    if (m < n) {
        int temp = n;
        n = m;
        m = temp;
    }

    while (r != 0) {
        r = fmod(m, n);

        if (r == 0) {
            return n;
        }

        m = n;
        n = r;
    }

    return n;
}

int main(int argc, char const *argv[]) {

  int m = 199;
  int n = 544;
  double answer = GreatestComminDivisor(m, n);

  printf("GCD of %i and %i is %f \n", m, n, answer);

  return 0;
}

我是否在他的示例中遗漏了什么,他是否回答错了。我试图查找本书第三版的勘误表,但没有得到任何结果。只是想确保我不会发疯。

【问题讨论】:

  • 17 不是 199 中的除数,也不是 898 中的除数,即源代码中的数字。也许您误读了 Knuths 书中的数字?我非常怀疑 Knuth 会犯这样一个简单的错误。
  • 可能是打印错误。如果你只知道 GCD 是什么,你就不会问这个了
  • 对不起,当我复制到问题中时,898 是一个错误。我已将其更改为 Knuth 在他的书中所述的数字。他肯定说 199 和 544 的 GCD 是 17。我的问题是我遗漏了什么还是书中的错误?
  • @vish4071 抱歉,你为什么讨厌这个问题?冷静一下,如果你不喜欢这个问题,那就不要花时间在上面。敌意是怎么回事?
  • @LeeDale: 199 不能被 17 整除。这可能是 119 的拼写错误。

标签: c algorithm knuth


【解决方案1】:

这是一个 GCD 函数的例子

int gcd( int a, int b )
{
    if ( b == 0 )
        return( a );
    else
        return( gcd( b, a % b ) );
}

数字是 119 和 544。

【讨论】:

  • 谢谢,我的问题更多是关于书中的答案,以及我是否遗漏了一些算法会导致我的答案 1 错误。
  • gcd(199,544) 是 1。gcd(119,544) 是 17。我会让你从中得出你自己的结论。
【解决方案2】:

基于已接受答案的无递归算法:

int gcd (int a, int b)
{
  int mod;

  while((mod = a % b) != 0)
  {
    a = b;
    b = mod;
  }

  return b;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多