要求两个整数得到最大公约数(GCD)?

时间:2016-10-20 05:22:15

标签: c algorithm

我是这里的新网站,我希望我在这里度过愉快的时光。我目前正在做一个任务,目前卡在第一个问题,程序要求两个整数,以计算和显示最大的公约数,或GCD。

根据问题:

  

计算GCD的经典算法,称为Euclid算法   如下:让m和n为包含两个数的变量。如果n为0,则停止;米   包含GCD。否则,计算m除以n时的余数。将n复制到m   并将余数复制到n。然后重复该过程,从测试n是否为0开始。

有了这个提示,我决定按如下方式编写代码:

#include <stdio.h>
int main() {
int first, second, m, n, GCD = 0;
printf("Enter two integers: ");
scanf("%d%d", &first, &second);
if (first > second) {
    m = first;
    n = second;
} else {
    m = second;
    n = first;
}
while(1) {
    if (n == 0) {
        GCD = m;
        break;
    } else {
        m = n;
        n = m % n;
    }
} 
printf("Greatest Common Divisor: %d\n", GCD);
}

但由于某种原因,GCD总是打印出较小的整数n,几乎就像忽略了它在while循环期间应该进行的计算:

Enter two integers: 12 28
Greatest Common Divisor: 12

何时显示,根据样本输出:

Enter two integers: 12 28
Greatest Common Divisor: 4 

我有什么问题吗?

2 个答案:

答案 0 :(得分:2)

m = n;
n = m % n;

m变为n,然后n变为m % n m % m:始终为零。您需要同时执行此操作(在C中不可能,因为它没有并发分配),或者使用临时变量:

t = m;
m = n;
n = t % n;

答案 1 :(得分:1)

else中的while loop语句使n = 0成为m = n,因为您声明了n = m % n,然后根据您的计划继续n = n % n /* Finds the greatest common divisor of 2 numbers inputted */ #include <stdio.h> int main() { int m, n, rem; printf("\nEnter the two integers: "); scanf("%d%d", &m, &n); while (n != 0) { rem = m % n; m = n; n = rem; } printf("\n\nGreatest common divisor: %d\n\n", m); } }}

您可以这样做以保持代码简单

parseInt()