求两个整数的最大公约数和最小公倍数

时间:2021-07-14 00:36:03
#include<iostream.h>
void main()
{
int m,n,t;
m=15;
n=10;
if(m<n)
{
t=m;
m=n;
n=t;
}
int m0=m,n0=n;
while(n!=0)
{
t=m%n;
m=n;
n=t;
}
cout<<"最大公约数为:"<<m<<endl;
cout<<"最小公倍数为:"<<m0*n0/m<<endl;
}
请高手给“分析”此程序,不是给出输出结果。。。

16 个解决方案

#1


#include <iostream.h> 
void main() 

int m,n,t; 
m=15; 
n=10; 
if(m <n) /*m小于n时交换两数,即m中始终存放两数中较大的*/

t=m; 
m=n; 
n=t; 

int m0=m,n0=n; 
while(n!=0) /*循环判断,m中存放最大公约数*/

t=m%n; 
m=n; 
n=t; 

cout < <"最大公约数为:" < <m < <endl; 
cout < <"最小公倍数为:" < <m0*n0/m < <endl; //通过找到的最大公约数,求最小公倍数

#2


引用楼主 perfectming 的帖子:
#include <iostream.h>
void main()
{
int m,n,t;
m=15;
n=10;
if(m <n)
{
t=m;
m=n;
n=t;
}
int m0=m,n0=n;
while(n!=0)
{
t=m%n;
m=n;
n=t;
}
cout < <"最大公约数为:" < <m < <endl;
cout < <"最小公倍数为:" < <m0*n0/m < <endl;
}
请高手给“分析”此程序,不是给出输出结果。。。


这个要是看不懂的话就回去补习数学去

#3


你应该学会单步调试,不要一遇到这种问题就问人家分析过程,要自己会分析,这种问题教不来的,一千个问题有一千个问题的分析结果,所以你要学会自己单步调试。 

单步调试会吗?设一个断点,按F10,一步步执行下去,必要的时候按F11跟进函数里面。 

单步调试是作为程序员最基本的调试程序能力,分析程序如何运作,有那些潜在问题,很多时候都靠单步调试。 

单步调试,会让你受益匪浅!

#4


楼主好像发了好几个帖子哦!怎么?让大家帮你写注释吗?呵呵!

#5


引用 2 楼 fallening 的回复:
这个要是看不懂的话就回去补习数学去 

有点儿过了哦!不要打击人家嘛,呵呵!楼主好好研究一下吧!动脑子的研究哦!不是看看就罢的哦!

#6


辗转相除法, 这是数学问题.

#7


while语句中是辗转相除法!
整数m,n,若m>n,m与n的最大公约数等于n与m%n的最大公约数;
若n=0,m与n的最大公约数等于m

#8


我来写个lz能看懂的

int f1(int a,int b)//最大公约数
{
  int i;
  if (a>b)
  c=b;
  else c=a;  //求a b中小的数

 for (i=c;i>0;c--)
{
 if(a%i==0&&b%i==0)
 break;
}
return i;
}
}
如果楼主连这个都看不懂……那就==我白写了

#9


ls写的确实很费脑子……

#10


int f2(int a,int b)//最小公约数 

  int i; 
  if (a>b) 
  c=a; 
  else c=b;  //求a b中大的数 

 for (i=c;i<=a*b;c++) //从大的书到a×b循环,因为a×b肯定是a和b的公倍数

 if(i%a==0&&i%b==0) 
 break; 

return i; 


给分给分

#11


引用 10 楼 happy446 的回复:
int f2(int a,int b)//最小公约数
{
int i;
if (a>b)
c=a;
else c=b;  //求a b中大的数

for (i=c;i <=a*b;c++) //从大的书到a×b循环,因为a×b肯定是a和b的公倍数
{
if(i%a==0&&i%b==0)
break;
}
return i;
}
}
给分给分

楼上的帅哥,告诉我你第5行里边的那个c是什么东西?

#12


辗转相除就行了。

#13


话说有一天。。。。。。要求个公约数,忘了辗除算法怎么实现了,自己把它推导了出来,想必楼主要的就是这个推导过程吧。
额,貌似我还真的又忘了这算法了,推一次给楼主看看吧。
首先,有两个数A和B(假定A大于B,反正你总能找出大的那个的),求出他们的差C,然后用B去除C,这里注意,如果B除C能除尽,假设得商为D,那么,A除C肯定等于D+1,就是说,C是A和B的公约数,那么是不是最大公约数呢?当然是的,如果A和B还存在一个比C更大的公约数E的话,那么,A和B的差C,肯定也要是E的倍数,但是E又大于C,相互矛盾,因此,如果B除C能除尽,C就是A和B的最大公约数。假如除不尽呢?下一步就是把待定数据变成B和C,找出B和C的最大公约数C1,因为A=B+C,所以A也是C1的倍数,即C1是A和B的约数,是不是最大公约数吗?当然是的,如果A和B存在一个比C1更大的公约数E1,那么A和B的差C也是E1的倍数,即E1是B和C的公约数,前面已经证明,C1是B和C的最大公约数,可是E1又是大于C1的约数,前后矛盾,所以,B和C的最大公约数C1,一定是A和B的最大公约数。
证明这两步以后,就是一个递归过程了,一步对,步步对的事。
至于最小公倍数=A*B/C,这种问题,我想用不着再解释吧,就是一个从二者的积中除去最大的重复值的过程。
不知道楼主看明白没有。
PS:建议3楼回家爬去,都什么跟什么啊,第一次看到有人拿单步调试当九阴真经卖弄的。

#14


回11楼的

忘记声明了而已

#15


#include<iostream>
#include<cmath>
using namespace std;
void main()
{
   int m,n,t;
   cin>>m>>n;
   int m0=m,n0=n;
   if(n>m)
   {
      t=n;
      n=m;
      m=t;
   }
   while(t!=0)
   {
     t=abs(m-n);
     m=n;
     n=t;
   }
   cout<<"zui xiao gong yue shu shi:"<<m<<endl;
   cout<<"zui da gong bei shu shi:"<<m0*n0/m<<endl;
}
各位请看下这个代码怎么样啊!
很不错的哦!!!

#16


话说,
int m0=m,n0=n;
while(n!=0)
{
t=m%n;
m=n;
n=t;
}
这个算法谁给解释下咩,还真是看不懂。为什么这个m就是最小公约数。。

#1


#include <iostream.h> 
void main() 

int m,n,t; 
m=15; 
n=10; 
if(m <n) /*m小于n时交换两数,即m中始终存放两数中较大的*/

t=m; 
m=n; 
n=t; 

int m0=m,n0=n; 
while(n!=0) /*循环判断,m中存放最大公约数*/

t=m%n; 
m=n; 
n=t; 

cout < <"最大公约数为:" < <m < <endl; 
cout < <"最小公倍数为:" < <m0*n0/m < <endl; //通过找到的最大公约数,求最小公倍数

#2


引用楼主 perfectming 的帖子:
#include <iostream.h>
void main()
{
int m,n,t;
m=15;
n=10;
if(m <n)
{
t=m;
m=n;
n=t;
}
int m0=m,n0=n;
while(n!=0)
{
t=m%n;
m=n;
n=t;
}
cout < <"最大公约数为:" < <m < <endl;
cout < <"最小公倍数为:" < <m0*n0/m < <endl;
}
请高手给“分析”此程序,不是给出输出结果。。。


这个要是看不懂的话就回去补习数学去

#3


你应该学会单步调试,不要一遇到这种问题就问人家分析过程,要自己会分析,这种问题教不来的,一千个问题有一千个问题的分析结果,所以你要学会自己单步调试。 

单步调试会吗?设一个断点,按F10,一步步执行下去,必要的时候按F11跟进函数里面。 

单步调试是作为程序员最基本的调试程序能力,分析程序如何运作,有那些潜在问题,很多时候都靠单步调试。 

单步调试,会让你受益匪浅!

#4


楼主好像发了好几个帖子哦!怎么?让大家帮你写注释吗?呵呵!

#5


引用 2 楼 fallening 的回复:
这个要是看不懂的话就回去补习数学去 

有点儿过了哦!不要打击人家嘛,呵呵!楼主好好研究一下吧!动脑子的研究哦!不是看看就罢的哦!

#6


辗转相除法, 这是数学问题.

#7


while语句中是辗转相除法!
整数m,n,若m>n,m与n的最大公约数等于n与m%n的最大公约数;
若n=0,m与n的最大公约数等于m

#8


我来写个lz能看懂的

int f1(int a,int b)//最大公约数
{
  int i;
  if (a>b)
  c=b;
  else c=a;  //求a b中小的数

 for (i=c;i>0;c--)
{
 if(a%i==0&&b%i==0)
 break;
}
return i;
}
}
如果楼主连这个都看不懂……那就==我白写了

#9


ls写的确实很费脑子……

#10


int f2(int a,int b)//最小公约数 

  int i; 
  if (a>b) 
  c=a; 
  else c=b;  //求a b中大的数 

 for (i=c;i<=a*b;c++) //从大的书到a×b循环,因为a×b肯定是a和b的公倍数

 if(i%a==0&&i%b==0) 
 break; 

return i; 


给分给分

#11


引用 10 楼 happy446 的回复:
int f2(int a,int b)//最小公约数
{
int i;
if (a>b)
c=a;
else c=b;  //求a b中大的数

for (i=c;i <=a*b;c++) //从大的书到a×b循环,因为a×b肯定是a和b的公倍数
{
if(i%a==0&&i%b==0)
break;
}
return i;
}
}
给分给分

楼上的帅哥,告诉我你第5行里边的那个c是什么东西?

#12


辗转相除就行了。

#13


话说有一天。。。。。。要求个公约数,忘了辗除算法怎么实现了,自己把它推导了出来,想必楼主要的就是这个推导过程吧。
额,貌似我还真的又忘了这算法了,推一次给楼主看看吧。
首先,有两个数A和B(假定A大于B,反正你总能找出大的那个的),求出他们的差C,然后用B去除C,这里注意,如果B除C能除尽,假设得商为D,那么,A除C肯定等于D+1,就是说,C是A和B的公约数,那么是不是最大公约数呢?当然是的,如果A和B还存在一个比C更大的公约数E的话,那么,A和B的差C,肯定也要是E的倍数,但是E又大于C,相互矛盾,因此,如果B除C能除尽,C就是A和B的最大公约数。假如除不尽呢?下一步就是把待定数据变成B和C,找出B和C的最大公约数C1,因为A=B+C,所以A也是C1的倍数,即C1是A和B的约数,是不是最大公约数吗?当然是的,如果A和B存在一个比C1更大的公约数E1,那么A和B的差C也是E1的倍数,即E1是B和C的公约数,前面已经证明,C1是B和C的最大公约数,可是E1又是大于C1的约数,前后矛盾,所以,B和C的最大公约数C1,一定是A和B的最大公约数。
证明这两步以后,就是一个递归过程了,一步对,步步对的事。
至于最小公倍数=A*B/C,这种问题,我想用不着再解释吧,就是一个从二者的积中除去最大的重复值的过程。
不知道楼主看明白没有。
PS:建议3楼回家爬去,都什么跟什么啊,第一次看到有人拿单步调试当九阴真经卖弄的。

#14


回11楼的

忘记声明了而已

#15


#include<iostream>
#include<cmath>
using namespace std;
void main()
{
   int m,n,t;
   cin>>m>>n;
   int m0=m,n0=n;
   if(n>m)
   {
      t=n;
      n=m;
      m=t;
   }
   while(t!=0)
   {
     t=abs(m-n);
     m=n;
     n=t;
   }
   cout<<"zui xiao gong yue shu shi:"<<m<<endl;
   cout<<"zui da gong bei shu shi:"<<m0*n0/m<<endl;
}
各位请看下这个代码怎么样啊!
很不错的哦!!!

#16


话说,
int m0=m,n0=n;
while(n!=0)
{
t=m%n;
m=n;
n=t;
}
这个算法谁给解释下咩,还真是看不懂。为什么这个m就是最小公约数。。