| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 704 人关注过本帖
标题:小弟初学C++,再来问个基础问题。
只看楼主 加入收藏
kybo04
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2009-11-16
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:5 
小弟初学C++,再来问个基础问题。
以下程序是求两个整数的最小公约数和公倍数的。

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的余数,以及后面的运算,算出来的公约数应该是错误的吧?

请教各位大哥大姐。

搜索更多相关主题的帖子: 初学 基础 
2009-11-18 00:33
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:5 
if (m > n) swap(m,n);
为句删除,没什么作用。你要理解下求模。

迭代的是人,递归的是神。
2009-11-18 11:59
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:5 
gcd(a,b)=gcd(b,a mod b)
如果a小于b的话,a mod b 始终等于a,所以必须交换,才能有"缩小"的效果.

樱花大战,  有爱.
2009-11-18 12:00
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
非负数的情况下,不要那句也是可以的.

樱花大战,  有爱.
2009-11-18 12:01
kybo04
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2009-11-16
收藏
得分:0 
mod是什么,还没学到呢,刚学到指针。不过还是谢谢了,等我学完了再回来理解下。
2009-11-18 19:44
kybo04
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2009-11-16
收藏
得分:0 
哦~~~我知道了~
是我数学基础不行,刚上百度找了下,知道了。
确实那句可有可无。

感谢你们给我个方向。
2009-11-18 19:54
快速回复:小弟初学C++,再来问个基础问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012222 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved