[英]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,没有必要这样做,因为除以更大数字的余数始终是原始数字,所以如果您有序列3
、 8
,第一个余数将是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.