最大公约数
问题描述:给出两个正整数,求这两个正整数的最大公约数
方法一:枚举法
PS:最“笨”的方法
思路:
1.找出两者中较小者记录为min;
2. 历遍区间 [1,min] 内所有数;
3. 找出能被两个整数整除(取余结果等于零)的 那个数;
代码实现:
#include<stdio.h>
int main()
{
int a,b;
int min;
int i,t;
scanf("%d %d",&a,&b);
//找出两者中较小者
if(a>b){
min = b;
}
else{
min = a;
}
//从1开始到min结束,找出它们的公约数并用t来记录
//最后t的值即为最大公约数
for(i=1;i<=min;i++){
if(a%i==0 && b%i==0){
t=i;
}
}
printf("%d\n",t);
return 0;
}
优点:通俗易懂,可读性强
缺点:效率不高
方法二:辗转相除法
思路:
1.如果 b等于0,计算结束,a就是最大公约数;
2.否则,计算a除以b的余数,让a等于b,而b等于那个余数;
3.回到第一步。
示例:
a | b | t |
---|---|---|
16 | 24 | 16 |
24 | 16 | 8 |
16 | 8 | 0 |
8 | 0 |
代码实现:
#include<stdio.h>
int main()
{
int a,b,t;
scanf("%d %d",&a,&b);
//当b等于0时循环结束
while(b>0){
t = a%b;
a = b;
b = t;
}
printf("gcd=%d\n",a);
return 0;
}
优点:效率高;
方法三:辗转相减法
思路:
1.如果 a等于b,计算结束,a就是最大公约数;
2.否则,如果a >b,计算a-b并赋值给a,否则计算b-a并赋值给b;
3.回到第一步。
示例:
a | b |
---|---|
16 | 24 |
16 | 8 |
8 | 8 |
代码实现:
#include<stdio.h>
int main()
{
int a,b,t;
scanf("%d %d",&a,&b);
while(a!=b){
if(a>b){
a=a-b;
}
else{
b=b-a;
}
}
printf("gcd=%d\n",a);
return 0;
}
优点:效率高;
最小公倍数
tip:两个整数相乘再除以最大公约数,即为最小公倍数;
以辗转相除法为例:
#include<stdio.h>
int main()
{
int a,b,t;
int a1,b1;
scanf("%d %d",&a,&b);
a1=a;
b1=b;
while(a!=b){
if(a>b){
a=a-b;
}
else{
b=b-a;
}
}
printf("%d\n",a1*b1/a);
return 0;
}