如何根据Euclid的算法将count变量放在这个gcd程序中?

时间:2016-01-30 07:24:22

标签: algorithm recursion count greatest-common-divisor

首先,这是Euclid计算GCD的算法(知道它的人可以直接跳到代码中)。

GCD(m,n)=GCD(n,m mod n)并继续执行此功能,直到您得到以下内容:GCD(m,n)=GCD(answer,0)。当你得到这个,你停下来,这就是我的程序试图做的事情。但是我想找到另一件事。递归GCD调用/分区的数量(让我们将此变量称为COUNT用于会话目的)它在答案中实际到达所需的数量。例如

GCD(60,24) = GCD (24, 12) = GCD (12, 0) =12所以这里的COUNT是3(包括最后一个),因为我们使用了Euclid算法两次。

在下面的代码中,我试图打印COUNT以及数字组合的GCD值,我似乎得到了错误的答案。

P.P.S我希望我已经正确解释了这一点。

这是代码

#include<stdio.h>
int gcd(int m , int n);
int count=0;
int main()
{
    int m,n;
    for(m=1;m<=10;m++)
    {
        for(n=1;n<=m;n++)
        {
            printf("gcd of %d, %d is :%d",m,n,gcd(m,n));
            printf(" with %d iterations\n",count);
        }
    }
}

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

1 个答案:

答案 0 :(得分:1)

首先,您的count = 0位于return声明之后。因此,它永远不会执行!

但是,即使在您切换count = 0return后,它仍然不正确,因为您在增加count后基本上将0设置为count。例如:

gcd(60,24) => count++ => count = 1
gcd(24, 12) => count++ => count = 2
gcd(12, 0) => count = 0 => count = 0

正确的方法是执行以下操作:

count = 0
gcd(60,24) => count++ => count = 1
gcd(24, 12) => count++ => count = 2
gcd(12, 0) => count++ => count = 3

此外,您的代码流程不正确。如果您致电gcd(5, 15)会怎样?您交换515,但之后您根本没有退货!修复它的方法是删除else语句。

这是重构的代码:

#include<stdio.h>

int gcd(int m , int n);
int gcd_wrapper(int m, int n);

int count=0;

int main(){
    int m,n;
    for(m=1;m<=10;m++)
    {
        for(n=1;n<=m;n++)
        {
            printf("gcd of %d, %d is :%d",m,n,gcd_wrapper(m,n));
            printf(" with %d iterations\n",count);
        }
    }
    return 0;
}

int gcd_wrapper(int m, int n) {
    count = 0;
    return gcd(m, n);
}

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