繁体   English   中英

在 C 中使用除法求 GCD

[英]Finding GCD using divison method in C

所以我想写一个 function 来计算两个数字的 Gcd 或 HCF 使用 Divison 方法。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

void gcd(int x, int y)
{
    int g,l;
    if (x >= y)
    {
        g = x;
        l = y;
    }

    else
    {
        g = y;
        l = x;
    }
    while (g % l != 0)
    {
        g = l;
        l = g % l;
    }

    printf("The GCD of %d and %d is %d", x, y, l);

}

int main(void)
{
    gcd(8, 3);

    return 0;
}

我没有得到 output 这个(错误?): Process returned -1073741676 (0xC0000094)

我的循环有问题吗?

在:

        g = l;
        l = g % l;

在计算g % l之前,分配g = l丢失g的值。 将其更改为:

        int t = g % l;
        g = l;
        l = t;

我使用这个循环 while 来找到两个数字的 gcd,如下所示:

void gcd(int x, int y)
{
    int k=x,l=y;
    if(x>0&&y>0)
    {
        while(x!=0&&y!=0)
        {
           if(x>y)
           {
               x=x-y;
           }
           else
           {
               y=y-x;
           }
        }
    }
  printf("\nThe GCD of %d and %d is %d", k, l, x);
}
int main(void)
{
   gcd(758,306);
   return 0;
}

Examples:

Input:

x=758 , y=306

x=27 , y=45

x=3 , y=8

Output:

printf("\nThe GCD of 758 and 306 is 2");

printf("\nThe GCD of 27 and 45 is 9");

printf("\nThe GCD of 3 and 8 is 1");

首先,考虑到当x >= y时您正在交换数字,这意味着您尝试输入两者中较小的x 对于 GDC,没有必要这样做,因为除以更大数字的余数始终是原始数字,所以如果您有序列38 ,第一个余数将是3 ,数字会自动切换位置算法的一部分。 所以没有必要使用g (我猜是greater )和l (对于lesser ),所以你可以避免这种情况。

#include <stdio.h>
#include <stdlib.h>

void gcd(int x, int y)
{
    int g,l;
    if (x >= y)
    {
        g = x;
        l = y;
    }

    else
    {
        g = y;
        l = x;
    }

然后,在第二部分(循环部分)中,您必须考虑到您在同一循环运行中两次计算g % l (这不是欧几里德算法)。

    while (g % l != 0)
    {
        g = l;
        l = g % l;
    }

您最好使用一个新变量r (其余部分,但我建议您使用更长的描述性名称),以便您始终了解该变量的含义。

    int r;
    while ((r = g % l) != 0) {
        g = l;
        l = r;
    }

你看? 我每个循环只做一个除法,但你做一个l = g % l; 它修改了 l 的值,使你通过循环的两次迭代成为 go。

最终程序是:

#include <stdio.h>
#include <stdlib.h>

int gcd(int greater, int lower)
{
    int remainder;

    while ((remainder = greater % lower) != 0) {
        printf("g=%d, l=%d, r=%d\n", greater, lower, remainder);
        greater = lower;
        lower = remainder;
    }

    return lower; /* remember that remainder got 0 in the last loop */

}

int main(void)
{
    int x = 6, y = 8;

    printf("The GCD of %d and %d is %d\n",
            x, y, gcd(x, y));

    printf("The GCD of %d and %d is %d\n",
            y, x, gcd(y, x));

    return EXIT_SUCCESS;
}

(我在gcd()循环中添加了一个跟踪printf来显示变量是如何变化的,并且两个计算 --- 改变参数值 --- 以显示我上面所说的关于顺序自动变化的内容。另外,它是最好将gcd()用作返回值的 function,并让main()决定是要打印结果,还是将该值用于其他用途。

好好享受:! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM