C 最大公约数和最小公倍数

来源:百度知道 编辑:UC知道 时间:2024/05/05 21:37:51
main()
{
int i,m,n,c,w;
scanf("%d%d",&m,&n);
for(i=m;i>=2;i--)
{if(m%2==0 && m%i==0){c=i;break;}}
for(i=m;i<=m*n;i++)
{if(i%m==0 && i%n==0){w=i;break;}}
printf("%d\n%d\n",c,w);
}
这样写哪里错了?

if(m%2==0 && m%i==0){c=i;break;}}
改成
if(n%2==0 && m%i==0){c=i;break;}}

我有更好的办法:

两个方法:
假设这两个数是a,b a>=b;
1
让变量i从b开始递减,for(i-b;i>2;i--)
判断能否被b整除

这个方法速度慢

2
设m为a,b的最大公约数,那么 a%m==0 b%m==0
令a = w*m; b= e*m; w,e都为整数
(a%b) == a - k*b; k肯定是一个整数;
=> a%b = w*m - k*b = w*m-k*e*m = (w-k*e)*m;
因为 w,e,k都是整数,并且a%b>=0;
=> (a%b) %m ==0;

所以求a,b的公约数就是求a%b,b的公约数

该方法速度很快。
int gcd(int a, int b) // a>=b
{
int t = a% b;
while( t > 0 )
{
a= b;
b= t;
t = a%b;
}
return b;
}

求最大公约处有问题。但求最小公倍是没问题的。
不知道你用的什么算法。
但是你可以用类似你最小公倍的算法啊,就是暴力法,呵呵。
把第一个FOR改为
for(i=m>n?m:n;i>=2;i--)
{
if(m%i==0 && n%i==0)
{
c=i;