问题描述:
输入两个数a和b,求它们的最大公约数和最小公倍数;
思路:
(a×b)/最大公约数=最小公倍数。
源代码:
方法一:
#include <stdio.h>
#include <stdlib.h>
int algorithm(int a,int b)
{
int num1 = a;
int num2 = b;
if(b>a)
{
int c = b;
b = a;
a = c;
}
int d = a % b;
while(d!=0)
{
a = b;
b = d;
d = a%b;
}
printf("最大公约数是:%d\n",b);
int sum = (num1*num2)/b;
printf("最小公倍数是:%d\n",sum);
}
int main()
{
int a = 0;
int b = 0;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
algorithm(a,b);
return 0;
}
这个方法比较繁琐,因为加入了a和b比较的部分。对上述代码进行优化得到方法二。
方法二:
#include <stdio.h>
#include <stdlib.h>
int algorithm(int a,int b)
{
int num1 =a;
int num2 =b;
while(b%a)
{
int c = b%a;
b = a;
a = c;
}
printf("最大公约数是:%d\n",a);
int sum = (num1*num2)/a;
printf("最小公倍数是:%d\n",sum);
}
int main()
{
int a = 0;
int b = 0;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
algorithm(a,b);
return 0;
}
方法一和方法二都称作辗转相除法。
方法三:
更相减损术:
以两数中较大的数减去较小的数,获得的差与原先较小的数构成新的一对数,在以大的数减去小的数,依次循环。用同样的方法操作,直至产生一对相等的数为止,该数即为最大公约数。
#include <stdio.h>
#include <stdlib.h>
int algorithm(int a,int b)
{
int n =1;
int num1 =a;
int num2 =b;
if(a<b)
{
a^=b;
b^=a;
a^=b;
}
while(n!=0)
{
a-=b;
if(a<b)
{
a^=b;
b^=a;
a^=b;
}
if(a==b)
{
n=0;
}
}
printf("最大公约数是:%d\n",b);
int sum = (num1*num2)/b;
printf("最小公倍数是:%d\n",sum);
}
int main()
{
int a = 0;
int b = 0;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
algorithm(a,b);
return 0;
}