编程求最大公约数和最小公倍数(有代码)

来源:百度知道 编辑:UC知道 时间:2024/05/19 15:44:42
谁能告诉我问题出在哪里??
#include <iostream.h>

int fun1(int,int),int fun2(int,int);

void main()
{
int a,b,m,n;
cout<<"请输入两个整数:";
cin>>a>>b;
m=fun1(a,b);
cout<<"这两个数的最小公倍数为:"<<m<<endl;
n=fun2(a,b);
cout<<"这两个数的最大公约数为:"<<n<<endl;
}

int fun1(int i,int j)
{
int k=i*j;
while(i!=j)
{
if(i>j) i-=j;
if(i<j) j-=i;
}
return k/i;
}

int fun2(int i,int j)
{
while(i!=j)
{
if(i>j) i-=j;
if(i<j) j-=i;
}
return i;
}
以上代码VC下运行正确,但有一点我不明白的是,为什么在“if(i<j)”时,是j-=i呢?两个函数的返回值都只跟i有关,如果把这一句改成i=j-i,运行时就得不了结果了,一直想不明白。。。。

while(i!=j)

只要i不等于j就一直做循环,所以最后返回i和返回j是一样的

while循环就是模拟辗转相除了
在while循环里面就是不停用大的数减去小的数,结果赋给原来的大的值。

所以i和j在整个过程中一直都是等价的,你那样改就不对了

j -= i相当于j = j - i,谁大谁是被减数,显然的。
不过这个程序的算法实在是差劲,最好还是用辗转相除法。

怎么会是等价的呢,明明可以啊
这算法从来没有见过 ~_~ 挺好的
不过fun2()函数可以去掉
直接n=a*b/m就可以了,简单了吧