#include <stdio.h>
int main(){
int x, y;printf("请分别输入两个整数:");scanf("%d %d",&x,&y);//保证y > xif(x > y){
int temp;
temp = x;
x = y;
y = temp;}// 辗转相除法metheo1(x,y);// 枚举法metheo2(x,y);// 更相减损法(辗转相减法)metheo3(x, y);// stein算法(效率高)metheo4(x, y);return0;}
1、辗转相除法
/*
辗转相除法:
原理:
令 y > x 保证y大于x;
a = y / x; ①
b = y % x; ②
由① ②可得:
y = ax + b;
所以(x,y)的公约数也就是(b,x)的公约数;
令f(x,y)表示x,y的公约数
则 f(x,y)= f(b,x);
*/
voidmetheo1(int x, int y){
int a, b;do{
a = y / x;
b = y % x;if(b ==0){printf("辗转相除法所得最大公约数是:%d\n",x);}else{
y = x;
x = b;}}while(b);}
2、枚举法
/*
枚举法:
原理:
选取数a,a的取值从两者中较小的数开始选取
若不满足(y % a == 0 && x % a == 0)
则递减直至第一个满足条件的数出现即为最大公约数
printf("枚举法所得最大公约数是:%d\n", a);
*/
voidmetheo2(int x, int y){
int a = x;for(a = x; a >=1; a--){if(y % a ==0&& x % a ==0){printf("枚举法所得最大公约数是:%d\n", a);break;}}}
3. 更相减损法(辗转相减法)
/*
更相减损法(辗转相减法)
原理:(同余)
y = ap , x = bp
y 以及 x 都为奇数
其中p为最大公约数,a、b为相应倍数
则 y - x = (a - b)p,当a = b = 1时及y = x时,y = x = p即为最大公约数
*/
voidmetheo3(int x, int y){
int cnt =0;do{if(x %2==0&& y %2==0){
x = x /2;
y = y /2;
cnt++;}else{while(y != x){
int a = x;
x = y - x;if(a < x){
int temp = x;
x = a;
a = temp;}
y = a;}if(cnt ==0){printf("用更相减损法所得的最大公约数为:%d\n",x);
cnt =0;}else{printf("用更相减损法所得的最大公约数为:%d\n",2*cnt*x);}break;}}while(cnt);}