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

大侠们赶紧进啊!来给咱们讲讲最小公倍数与最大公约数问题啊!!!谢啦!

跳跳鱼 发布于 2011-05-15 10:51, 376 次点击
题目是这样的:输入两个正整数m和n,求其中最大公约数与最小公倍数。
答案:#include <iostream>
using namespace std;
int main ()
{int p,r,n,m,temp;
 cout<<"please enter two positive integer numbers n,m:";
 cin>>n>>m;
 if (n<m)              
     {temp=n;
      n=m;
      m=temp;                //把大数放在n中, 小数放在m中
     }
 p=n*m;                     //先将n和m的乘积保存在p中, 以便求最小公倍数时用
 while (m!=0)               //求n和m的最大公约数
    {r=n%m;
     n=m;            
     m=r;
 }
 cout<<"HCF="<<n<<endl;
 cout<<"LCD="<<p/n<<endl;        // p是原来两个整数的乘积
 return 0;
 }  
while语句那一段不太明白啊!请指点一下迷津吧!
 



   
   
4 回复
#2
寒风中的细雨2011-05-15 15:55
程序代码:
#include <iostream>
using namespace std;

int function(int n, int m);

int main ()
{
    int p,r,n,m;
    cout << "please enter two positive integer numbers n,m:";
    cin >> n >> m;

    p=n*m;                     //先将n和m的乘积保存在p中, 以便求最小公倍数时用
/*
    while (m!=0)               //求n和m的最大公约数
    {
        r=n%m;
        n=m;           
        m=r;
    }
*/
    n = function(n, m);

    cout<<"HCF="<<n<<endl;
    cout<<"LCD="<<p/n<<endl;        // p是原来两个整数的乘积

    return 0;
}
//while语句那一段不太明白啊!请指点一下迷津吧
/*


 *在while当中每次的循环可以这样来理解

 *对于n 和 m  假设条件 n >= m 恒成立

 *那么把n进行变形 成为 n = m*x + y; (x>=1,  m>y>=0)

 *那么下次循环的时候 把m调成n 把y调成m  依次进行下去 直到变形式当中y=m

 *则m就为最大公约数

 
*/
//递归实现
int function(int n, int m)
{
    if (n%m == 0)
    {
        return m;
    }
    else
    {
        return function(m, n%m);
    }
}
#3
跳跳鱼2011-05-15 22:13
这是不是说明我的数学不太好啊!我主要是数学原理不懂啊!!呜呜!不过还是谢谢你!悲催滴数学!
#4
w_16092011-05-16 00:19
辗转相除法, 去百度下你就知道了。。。
#5
跳跳鱼2011-05-16 17:28
回复 4楼 w_1609
谢谢啦!嘿嘿!
1