引子
求两数的最大公约数
-----简单吗?
-----简单!
-----用多种方法求,可以吗?
-----emmmmm....应该可以吧?!!!
正文
方法一:
相信绝大多数人都知道求最大公约数的如下代码所示的这种方法
#include<stdio.h>
#include<Windows.h>
int CommonDivisor(int x,int y)
{
int min = x > y ? y : x;
while (min > 1){
if (x%min == 0 && y%min == 0){
break;
}
min--;
}
return min;
}
int main()
{
int max = CommonDivisor(25, 125);
printf("%d\n", max);
system("pause");
return 0;
}
先判断两个数的大小,将较小的数作为被除数,当满足两个数同时除以该被除数时跳出循环输出最大公约数,否则,被除数减一,循环...
方法二:辗转相减法
百度百科定义为:
辗转相减法,又称尼考曼彻斯法,是一种简便的求出两数最大公约数的方法
算法描述:做一系列减法,从而求得最大公约数。
例如 :
35和14
35-14=21 , 21-14=7 , 14-7=7 , 7-7=0 ,所以35和14的最大公约数为7
36和22
36-22=14 , 22-14=8 , 14-8=6 , 8-6=2 , 6-2=4 , 4-2=2 , 2-2=0, 所以36和22的最大公约数为2
#include<stdio.h>
#include<Windows.h>
int CommonDivisor(int x,int y)
{
while (1){
if (x > y){
x = x - y;
}
else if (y > x){
y = y - x;
}
else{
break;
}
}
return x;
}
int main()
{
printf("%d\n", CommonDivisor(25, 125));
system("pause");
return 0;
}
方法三:辗转相除法
百度百科定义为:
辗转相除法,又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法
算式描述:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反
复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数
例如:
100与125
125%25=25 , 25%25=0 , 所以25为100和125的最大公约数
36和22
36%22=14 , 22%14=8 , 14%8=6 , 8%6=2 ,6%2=0 ,所以2为36和22的最大公约数
#include<stdio.h>
#include<Windows.h>
int CommonDivisor(int x,int y)
{
while ((x*y)!= 0){
if (x > y){
x %= y;
}
else if (y > x){
y %= x;
}
else{
break;
}
}
return x;
}
int main()
{
printf("%d\n", CommonDivisor(25, 125));
system("pause");
return 0;
}