用C语言实现:求两个数的最小公倍数?

乐于编程 2009-10-03 04:18:59
怎用C语言实现求两个数的最小公倍数?
...全文
6134 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 arong1234 的回复:]
这应该是一种方法,但是可能是很差的办法,例如我们有一对很大的质数p,q,我们计算他们的最小公倍数,则其结果必然是P*q,按照你的方法,需要进行q次求积,q次求模才能得到结果。而用辗转相除法,效率要高很多
引用 16 楼 mythofking 的回复:
引用 12 楼 arong1234 的回复:

我的意思是,7不是5,7的最小公倍数,所以7*2=14,14还不是它们的公倍数,所以,7*3=21,还不是,7*4=28,还不是,7*5=35,是了。

[/Quote]
所以我说这是"最笨的方法"嘛!^_^
scofie 2009-10-04
  • 打赏
  • 举报
回复
学习学习下。。。。
arong1234 2009-10-04
  • 打赏
  • 举报
回复
这应该是一种方法,但是可能是很差的办法,例如我们有一对很大的质数p,q,我们计算他们的最小公倍数,则其结果必然是P*q,按照你的方法,需要进行q次求积,q次求模才能得到结果。而用辗转相除法,效率要高很多
[Quote=引用 16 楼 mythofking 的回复:]
引用 12 楼 arong1234 的回复:

我的意思是,7不是5,7的最小公倍数,所以7*2=14,14还不是它们的公倍数,所以,7*3=21,还不是,7*4=28,还不是,7*5=35,是了。
[/Quote]
Dave888Zhou 2009-10-04
  • 打赏
  • 举报
回复
看代码:

#include <stdio.h>

/* 用欧几里德算法求最大公约数 */
unsigned gcd1(unsigned x,unsigned y){
unsigned temp;
while(y!=0){ /* 辗转相除 */
temp=y;
y=x%y;
x=temp;
}
return x;
}

/* 用更快的位运算求最大公约数,没有用任何的除法运算 */
unsigned gcd2(unsigned x,unsigned y){
unsigned temp;
unsigned power_of_two=0;

if(x==0) return y; /* 有一个为0的特殊情况 */
if(y==0) return x;

/* 求x和y的最大的公共幂因子2**powoftwo(**表示求幂) */
while(((x | y) & 1)==0){ /* 末位为0时,说明是偶数,还有因子2 */
x>>=1; /* 除以2 */
y>>=1;
++power_of_two;
} /* 循环结束时x和y中必一个为奇数 */

while((x & 1)==0) /* 若x仍为偶数,则让x变成奇数 */
x>>=1;

/* 对剩下的x和y,用最大公约数的性质(x,y)=(y,x-y)来求x和y的最大公约数 */
while(y){
/* x为奇数,且y为非0 */
while((y & 1)==0)
y>>=1; /* 让y变成奇数 */

/* 现在剩下的x和y均为奇数 */
temp=y;
if(x>y)
y=x-y;
else
y=y-x;
x=temp;
}
return (x<<power_of_two); /* 返回原先x和y的最大公约数 */
}

/* 求最小公倍数 */
unsigned lcm(unsigned x,unsigned y){
return x*y/gcd2(x,y);
}

int main(){
printf("%u\n",gcd1(16,24));
printf("%u\n",gcd2(16,24));
printf("%u\n",lcm(16,24));
return 0;
}
wzywsk 2009-10-04
  • 打赏
  • 举报
回复
用展转相除法p和q是要求的俩个数
while(1)
{r=p%q;
if(r==0)
{printf("zuidagongyue=%d",q);
break;
}
p=q;q=r;
}
love_yewei 2009-10-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 stacy06 的回复:]
{
int i=1;
while(i%X1!=0||i%X2!=0)
  i++;
return i;
}

这样可以吧?呵呵
[/Quote]

i 从max(x1,x2)开始好一点,呵呵
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arong1234 的回复:]
简单的反例,数5,7,他们最小公倍数是35,按照你的算法,则得到的是5*2*3*5*7
引用 5 楼 mythofking 的回复:
最笨的方法:在两个数中,选那个大的数,然后去除以那个小的数,如果能整除,那么最小公倍数就是那个大的数,如果不能,就把那个大的数乘以2,再去除以那个小的数,如果还不能整除,那么就把大的数乘以3,...一直到把那个大的数乘以那个小的数。

[/Quote]
我的意思是,7不是5,7的最小公倍数,所以7*2=14,14还不是它们的公倍数,所以,7*3=21,还不是,7*4=28,还不是,7*5=35,是了。
乐于编程 2009-10-04
  • 打赏
  • 举报
回复
求最大公约数之后,求最小公倍数。
好方法

谢谢!
zjhiphop2006 2009-10-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 niulin 的回复:]
给你个能用的....

求最大公约数:
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}

求最小公倍数:
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
[/Quote]

正解!!
arong1234 2009-10-03
  • 打赏
  • 举报
回复
简单的反例,数5,7,他们最小公倍数是35,按照你的算法,则得到的是5*2*3*5*7
[Quote=引用 5 楼 mythofking 的回复:]
最笨的方法:在两个数中,选那个大的数,然后去除以那个小的数,如果能整除,那么最小公倍数就是那个大的数,如果不能,就把那个大的数乘以2,再去除以那个小的数,如果还不能整除,那么就把大的数乘以3,...一直到把那个大的数乘以那个小的数。
[/Quote]
niulin 2009-10-03
  • 打赏
  • 举报
回复
给你个能用的....

求最大公约数:
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}

求最小公倍数:
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
Fe361 2009-10-03
  • 打赏
  • 举报
回复
学习了.
水瓶06 2009-10-03
  • 打赏
  • 举报
回复
{
int i=1;
while(i%X1!=0||i%X2!=0)
i++;
return i;
}

这样可以吧?呵呵
pmerOFc 2009-10-03
  • 打赏
  • 举报
回复
什么叫“两个数”
无解
太乙 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 huiguixian 的回复:]
int func(int m, int n)
{
    int t,i = n, j = m;
    while ((m%n)!=0)
    {
        t = n;
        n = m % n;
        m = t;
       
    }
    return i*j/n;
}
辗转相除法球最大公约数 然后求最小公倍数
[/Quote]恩,辗转相除法!~~
小小攻城师 2009-10-03
  • 打赏
  • 举报
回复

int func(int m, int n)
{
int t,i = n, j = m;
while ((m%n)!=0)
{
t = n;
n = m % n;
m = t;

}
return i*j/n;
}
辗转相除法球最大公约数 然后求最小公倍数
  • 打赏
  • 举报
回复
最笨的方法:在两个数中,选那个大的数,然后去除以那个小的数,如果能整除,那么最小公倍数就是那个大的数,如果不能,就把那个大的数乘以2,再去除以那个小的数,如果还不能整除,那么就把大的数乘以3,...一直到把那个大的数乘以那个小的数。
Wind_Runner 2009-10-03
  • 打赏
  • 举报
回复
学习了,最大公约数的函数
wanjingwei 2009-10-03
  • 打赏
  • 举报
回复
网上一搜一大堆
#include <stdio.h>
int lcm(int a,int b);
//最小公倍数:lease common multiple
//Precondition:a,b为两个不为0的正整数
//Postcondition:返回a,b的最小公倍数
int main()
{
int a,b;
while(1)
{
printf("请输入两个正整数:");
scanf("%d %d",&a,&b);
printf("%d与%d的最小公倍数为:%d\n",a,b,lcm(a,b));
}
return 0;
}

int lcm(int a,int b)
{
int max = (a >= b?a:b),min = (a < b?a:b),i;
for(i = 1;;++i)
{
if((max * i) % min == 0)
{
return (max * i);
}
}
}
昵称很不好取 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 thefirstz 的回复:]
a * b / gcb(a,b) // gcb(a,b)为两数的最小公约数
[/Quote]
写错了,是最大公约数
加载更多回复(1)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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