1

我知道它非常简单,但我无法找出变量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;
}

如果我删除 variable 的使用t,则输入必须按降序给出(即最高输入优先)。如果t使用一切正常。我对编程很陌生,所以请帮忙。

4

5 回答 5

2

这是计算 GCD 的欧几里得算法。

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

这个逻辑减少了 a 和 b 的值。t 是一个持有 b 值的虚拟变量,同时正在计算 b 的下一个新值。这将更小。所以最终我们将能够以所需的结果终止算法。

于 2013-03-21T07:18:57.827 回答
1

在这个 t 是临时持有。

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

于 2013-03-21T07:03:42.033 回答
1

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

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

于 2013-03-21T07:07:15.450 回答
1

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

/* 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上图没有根本不同。

实现的算法是欧几里得算法。它基于除法定理,该定理指出对于正的ab,存在q这样的a = q*b + r0 <= r < b。在 C 中,r可以用 计算a % b

a小于的情况下ba % b则为a。因此,该算法允许ab在下一次迭代中切换位置。

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

int r[3] = { a, b, a % b };
int i = 0;
while (r[(i + 2) % 3]) {
    ++i;
    r[(i + 2) % 3] = r[i % 3] % r[(i + 1) % 3];
}
gcd = r[(i + 1) % 3];
于 2013-03-21T07:10:25.933 回答
1

根据您的程序逻辑,

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

所以基本上,您t可以帮助您在每次迭代中存储第二个数字,以便在下一次迭代中,您的第一个数字(即“%”运算符左侧的数字)是上一次迭代的第二个数字。(我希望这没有把你的废话弄糊涂)

所有这些都是必要的,因为您在每次迭代中都用 '%' 操作的结果覆盖了第二个数字。

于 2013-03-21T07:14:09.577 回答