c语言语法没有出错,但是运行达不到目的

写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输人。

# include <stdio.h>

int f(int n, int m)
{
    int t, v;

    if (n < m)
    {
        t = n;
        n = m;
        m = t;
    }

    while ((v = n%m) != 0)
    {
        n = m;
        m = v;
    }

    return m;
}

int g(int n, int m, int g)
{
    return (n*m)/g;
}

int main(void)
{
        int n, m, g, l;

    printf("n = ");
    scanf("%d", &n);

    printf("m = ");
    scanf("%d", &m);

    g = f(n, m);
    l = g(n, m, g);

    printf("greatest common divisor = %d\n", g);
    printf("Least common multiple = %d\n", l);

    return 0;
}

请问在:
while ((v = n%m) != 0)
{
n = m;
m = v;
}
中必须要(v = n%m)
然而这样:
while ((n%m) != 0)
{
n = m;
m = n%m;
}
虽然编译不会出错,但是运行达不到目的。
请教各位,不胜感激。

(V=n%m)!=0