最小公倍数与最大公约数的最优算法

catally 2005-05-07 09:25:03
下面的是自己写的,大家看看是不是最优算法

#include <iostream>
#include <stdlib.h>

using namespace std;

int g_cd(int m, int n) //我晕,论坛不能用“gcd”
{
int a,b; //小的为a,大的为b
if (m>n)
{
a=n;
b=m;
}
if (m<n)
{
a=m;
b=n;
}
if (m==n)
return m;

int temp=0;
for(;b%a!=0;a=temp%a) //b与a的相除的余数肯定含有最小公倍数
{
temp=b;
b=a;
}
return a;
}

int lcm(int m, int n)
{
int a,b;
a=g_cd(m,n);
if (m>n) //最小公倍数=较大的数*(较小的数/最大公约数)
{
b=n;
b/=a;
return m*b;
}
else
{
b=m;
b/=a;
return n*b;
}
}

int main(int argc, char *argv[])
{
int i,j;
cout<<"enter two ints:"<<endl;
cin>>i>>j;
cout<<"最大公约数:"<<g_cd(i,j)<<endl;
cout<<"最小公倍数:"<<lcm(i,j)<<endl;
system("PAUSE");
return 0;
}
...全文
424 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
catally 2005-05-08
  • 打赏
  • 举报
回复
to qhfu(崩溃)
你的那个pow……看起来很不爽的样子,其实都一样
把递归改一下就是拉,主要还是算法理论
我觉得我的比较好理解拉:)

//换成循环的
int g_cd2(int a,int b)
{
int c=1;
int m=a,n=b;
while(m!=0&&n!=0)
{
if (m%2==0&&n%2==0)
{
m /= 2;
n /= 2;
c *= 2;
continue;
}
if (m%2==0&&n%2!=0)
{
m /= 2;
continue;
}
if (m%2!=0&&n%2==0)
{
n /= 2;
continue;
}
if (m%2!=0&&n%2!=0)
{
int i=m;
m= m>n ? m-n:n-m; //m=abs(m-n);
if(i<n)
n=i;
continue;
}
}
if (m==0)
return n*c;
if (n==0)
return m*c;
}
xiongbing528 2005-05-07
  • 打赏
  • 举报
回复
可读行较好
效率不是很搞

呵呵
SENDFREE 2005-05-07
  • 打赏
  • 举报
回复
把 x/2 改成 x>>1
把 x%2 改成 x&1
把 x*2 改成 x<<1

位运算和整数加减是这个算法的优势 :)
qhfu 2005-05-07
  • 打赏
  • 举报
回复
#include <iostream>
#include <math.h>
using namespace std;

unsigned int g_cd(unsigned int a,unsigned int b)
{
if(a == 0)
return b;
if(b == 0)
return a;
int p = 0;
label: while((!(a % 2)) && (!(b % 2)))
{
a /= 2;
b /= 2;
p ++;
}
while(!(a % 2))
{
a /= 2;
}
while(!(b % 2))
{
b /= 2;
}

if((b % 2) && (a % 2))
{
unsigned int temp;
temp = a;
a = b;
b = temp > b ? temp - b:b - temp;
}
if(b != 0)
goto label;
return a * pow(2,p);

}
int main(){
unsigned int i = g_cd(456789988888,77888888888);
cout<<i;
system("pause");
}
qhfu 2005-05-07
  • 打赏
  • 举报
回复
看错了,是对2取余,不好意思 :)
qhfu 2005-05-07
  • 打赏
  • 举报
回复
不是吧! 你还用了递规调用, 还用了取余,这也叫最好算法?
catally 2005-05-07
  • 打赏
  • 举报
回复
OK,搞定了,理论上来说这是目前的最优算法了
时间比较紧,大家看看有没有什么Bug


//stein算法,求最大公约数
#include <cstdlib>
#include <iostream>

using namespace std;

int c=1;
int g_cd(int m, int n)
{
if (m==0)
return n*c;
if (n==0)
return m*c;
if (m%2==0&&n%2==0)
{
m /= 2;
n /= 2;
c *= 2;
return g_cd(m,n);
}
if (m%2==0&&n%2!=0)
{
m /= 2;
return g_cd(m,n);
}
if (m%2!=0&&n%2==0)
{
n /= 2;
return g_cd(m,n);
}
if (m%2!=0&&n%2!=0)
{
int i=m;
m=abs(m-n);
if(i<n)
n=i;
return g_cd(m,n);
}
}

int main(int argc, char *argv[])
{
int i,j;
cout<<"Enter 2 ints:"<<endl;
cin>>i>>j;
cout<<g_cd(i,j);
system("PAUSE");
return EXIT_SUCCESS;
}
catally 2005-05-07
  • 打赏
  • 举报
回复
是不是不能用“GCD”?
改成别的就ok了
qhfu 2005-05-07
  • 打赏
  • 举报
回复
不知道为什么发不出去,大家可以去看csdn开发高手的,2004年12期,上面有一篇文章介绍最大公约数的各种解法
llf_hust 2005-05-07
  • 打赏
  • 举报
回复
up
jhw4048 2005-05-07
  • 打赏
  • 举报
回复
顶一下先,坐着等看stein算法
qhfu 2005-05-07
  • 打赏
  • 举报
回复
写了一个stein算法,发不出去,,郁闷
qhfu 2005-05-07
  • 打赏
  • 举报
回复
goto?
qhfu 2005-05-07
  • 打赏
  • 举报
回复
怪了,不能回帖?
catally 2005-05-07
  • 打赏
  • 举报
回复
Stein 算法
嗯,这是什么原理类,想不通
SENDFREE 2005-05-07
  • 打赏
  • 举报
回复
Stein 算法

http://blog.vckbase.com/arong/archive/2004/06/15/458.aspx

65,202

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧