为什么我的GCD程序没有运行?

时间:2016-01-29 23:30:03

标签: c algorithm function recursion greatest-common-divisor

我试图在C中使用欧几里德算法(递归地)找到两个数字的GCD,我确实知道它在数学上并不完全完美,因为它忽略了负数条件,但我只是希望这个目前能为正数工作。

#include <stdio.h>

int gcd(int m, int n);

int main() {
    return gcd(60, 24);
}

int gcd(int m, int n) {
    if (m < n) {
        //swapping both a and b
        m = m + n;
        n = m - n;
        m = m - n;
    }
    if (m == n) {
        return m;
    } else {
        return gcd(n, m % n);   
    }
}

2 个答案:

答案 0 :(得分:5)

递归GCD的代码如下所示

int gcd(int m , int n)
{
    if (n==0)
        return m;

    return gcd(n, m%n);
}

不需要交换代码,因为这是由递归处理的。例如,考虑gcd(24,60)。在这种情况下n=60m%n = 24%60 = 24。因此递归调用是gcd(60,24),自动交换参数。

答案 1 :(得分:4)

gcd(60, 24) - &gt; gcd(24, 12) - &gt; gcd(12, 0)

这意味着您需要添加支票。

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

if ( m%n == 0 )
{
   return n;
}

您还可以通过另一次调用函数来删除变量交换代码,并在调用中交换值。

int gcd(int m, int n) {

   if (m < n) {
      return gcd(n, m);
   }

   if (m%n == 0) {
      return n;
   } else {
      return gcd(n, m % n);   
   }
}