欧几里德算法的思想:
欧几里德算法的思想基于辗转相除法的原理,辗转相除法是欧几里德算法的核心思想,欧几里德算法说白了就是辗转相除法的计算机算法的实现。
辗转相除法的内容:
如果用gcd(a,b)来表示a和b的最大公约数,那么根据辗转相除法的原理,有gcd(a,b)=gcd(b,a mod (b)),其中mod()表示模运算,并且不妨让a>b,这样方便于模运算。
伪代码如下
gcd(a, b) //要求保证传入的a>=b
if(b == 0)
return a
return gcd(b, a % b)
流程图如下图
欧几里得算法一
//功能:利用欧几里德算法,求整数a,b的最大公约数
//参数:整数a,b
//返回:a,b的最大公约数
//测试函数
#include<stdio.h>
int gcd(int a, int b);
int main()
{
printf("%d\n",gcd(4,12));
}
int gcd(int a, int b)
{
if(a < b){ //保证a大于等于b,便于a%b的运算
int temp;
temp = a;
a = b;
b = temp;
}
while(a % b){ //如果余数不为0,就一直进行辗转相除
int r = a % b; //r为a和b的余数,即r = a mod(b);
a = b;
b = r;
r = a % b;
}
return b;
}
欧几里得算法二
//欧几里德算法
#include <stdio.h>
int gcd(int a, int b)
{
if(b == 0)
return a;
return gcd(b, a%b);
}
int main(void)
{
int a, b;
printf("enter two number:\n");
scanf("%d%d", &a, &b);
printf("最大公约数为:%d\n", gcd(a, b));
return 0;
}
普通算法
/*
编程求取两个整数的最大公约数。
Enter two integers:12 28
Greatest common divisor:4
提示:分别用两个变量m、n存储两个整数。如果n为0,那么停止操作,
m中的值就是最大公约数,否则计算m除以n的余数,把n保存到m中,并
把余数保存到n中。然后重复上述过程,每次都先判定n是否为0。
*/
#include <stdio.h>
int main(void)
{
int a, b, i, t;
scanf("%d%d", &a, &b);
if(a > b){
t = a;
a = b;
b = t;
}//确保a是最小值
for(i = a; i >= 2; i--){
if(a%i == 0 && b%i == 0){
printf("最大公约是:%d\n", i);
break;
}
}
if(i == 1){
printf("两数只能同时被1整除\n");
}
return 0;
}