解释打印两个数字的GCD和LCD的程序的工作

时间:2013-03-21 06:58:05

标签: c

我知道它非常简单,但我无法找出变量t的用途。

int main() {
    int a, b, x, y, t, gcd, lcm;

    printf("Enter two integers\n");
    scanf("%d%d", &x, &y);

    a = x;
    b = y;

    while (b != 0) {
       t = b;
        b = a % b;
        a = t;
    }

    gcd = a;
    lcm = (x*y)/gcd;

    printf("Greatest common divisor of %d and %d = %d\n", x, y, gcd);
    printf("Least common multiple of %d and %d = %d\n", x, y, lcm);

    return 0;
}

如果我删除变量t的用法,则必须按递减顺序给出输入(即,首先输入最高值)。如果使用t,一切正常。我是编程新手,所以请帮助。

5 个答案:

答案 0 :(得分:2)

这是Euclid计算GCD的算法。

 function gcd(a, b){
     while (b ≠ 0){
        t := b;
        b := a mod t;
        a := t;
      }
     return a
    }

该逻辑减少了a和b的值。 t是保持b值的虚拟变量,而b的下一个新值正在计算中。这个数字的幅度会更小。因此,最终我们将能够使用所需的结果终止算法。

答案 1 :(得分:1)

这是暂时的持有。

在此while循环中a%b必须设置为b,并且b的值必须设置为a。 为了避免损失b的值。

答案 2 :(得分:1)

假设您有2个值 - 旧的'a'和旧的'b'(没有't')。

'while'循环应该将这些值更新为新的'a'和新的'b'。 每次重新计算新的'a'都需要旧的'b',每次重新计算新的'b'都需要旧的'a'。 但是,如果先计算'b',它会覆盖旧值,而无法正确计算'a'。反过来相反 - 重新计算新的'a',你丢失旧的值,不能用它来计算'b'。因此,您需要一个临时变量来存储您在迭代中首先重新计算的变量('a'或'b')的旧值,然后使用此缓存值计算另一个变量:)'t'是此临时变量

答案 3 :(得分:1)

使用临时变量是一种常见的编程习惯。它用于保存变量值的副本,以便稍后在使用不同值更新变量后可以使用该值。也许最简单的用例是 swap ,也称为 exchange

/* swap the values held by a and b */
t = b; /* t holds the value in b */
b = a; /* b gets the value in a */
a = t; /* a gets the value in t */

while循环的逻辑与上图没有根本区别。

实现的算法是 Euclid算法。它基于除法定理,它指出对于正ab,存在qa = q*b + r和{{1} }}。在C中,0 <= r < b可以使用r计算。

如果a % b小于a,则ba % b。因此,该算法允许aa在下一次迭代时切换位置。

如果你想要一个没有临时性的算法公式,你可以使用循环缓冲区。

b

答案 4 :(得分:1)

根据你的程序逻辑,

  • 考虑两个数字--2和3。
  • 计算GCD,
    1. 计算2%3。结果是2(不是0)所以继续。
    2. 计算3%结果=&gt; 3%2。结果是1(不是0)所以继续。
    3. 计算2%结果=&gt; 2%1。这个答案是0.因此我们的GCD是第二个数字(即)1。

基本上,你的t可以帮助你在每次迭代中存储第二个数字,这样在下一次迭代中,你的第一个数字(即'%'运算符左边的数字)就是前一个迭代的第二个数字数。 (我希望不会混淆你的废话)

这一切都是必要的,因为你在每次迭代中用'%'操作的结果覆盖第二个数字。