注册 登录
编程论坛 C++教室

小弟初学C++,再来问个基础问题。

kybo04 发布于 2009-11-18 00:33, 704 次点击
以下程序是求两个整数的最小公约数和公倍数的。

int lcm(int,int); //声明计算最小公倍数的函数
int gcd(int,int); //声明计算最大公约数的函数

int main(int argc, char* argv[])
{
    int m,n;
    cout << "请输入两个非负数: ";
    cin >> m >> n;
    cout << "gcd(" << m << "," << n << ") = " << gcd(m,n) <<endl;
    cout << "lcm(" << m << "," << n << ") = " << lcm(m,n) <<endl;
    return 0;
}

int gcd (int m,int n) //计算最大公约数
{
    if (m > n) swap(m,n);
    while(n > 0)
    {
        int r = m % n;
        m = n;
        n = r;
    }
    return m;
}

int lcm (int m,int n)//计算最小公倍数
{
    return (m*n / gcd(m,n));
}

首先,这个程序没有问题,运行也正确。
小弟的疑问出现在红色字体部分,按照小弟的理解,应该改成if (m < n) swap(m,n);才对,要大的除以小的嘛。改完后试下,发现程序也没问题,运行结果也都正确。
于是我就索性把if (m > n) swap(m,n);这条语句前面直接加//,就是不让他运行。发现运行结果也正确(就是不管是<,>还是不运行,对结果都没影响),但是按照我的想法是,如果m<n,那m除以n的余数,以及后面的运算,算出来的公约数应该是错误的吧?

请教各位大哥大姐。

5 回复
#2
lintaoyn2009-11-18 11:59
if (m > n) swap(m,n);
为句删除,没什么作用。你要理解下求模。
#3
中学者2009-11-18 12:00
gcd(a,b)=gcd(b,a mod b)
如果a小于b的话,a mod b 始终等于a,所以必须交换,才能有"缩小"的效果.
#4
中学者2009-11-18 12:01
非负数的情况下,不要那句也是可以的.
#5
kybo042009-11-18 19:44
mod是什么,还没学到呢,刚学到指针。不过还是谢谢了,等我学完了再回来理解下。
#6
kybo042009-11-18 19:54
哦~~~我知道了~
是我数学基础不行,刚上百度找了下,知道了。
确实那句可有可无。

感谢你们给我个方向。
1