1.求任意两个正整数的最大公约数(GCD)
问题分析
如果有一个数a能被数b整除,则称a为b的倍数,b为a的约数。几个数公有的约数,叫做公约数。公约数中最大的一个公约数,称为这几个数的最大公约数。
要求任意两个正整数的最大公约数即求出一个不大于其中两者中的任何一个,但又能同时整除两个整数的最大自然数。
1.穷举法
第一种采用穷举法按从小到大(初值为1,最大值为两个整数当中较小的数)的顺序将所有满足条件的公约数列出,输出其中最大的一个;
第二种直接从大到小,当出现第一个即为所求,break
int gcd(int m,int n){
int min,num;
if(m>n) min = n;
else min = m;
for(int i = min;i>=1;i--){
if(m%i==0&&n%i==0){
num = i;
break;
}
}
return num;
}
2.更相减损法
判断a和b那个大,然后大数就减去小数的,再将减去得到的值赋予大数的位置,继续判断,直至两数相等,这时,a=b=最大公约数
int gcd(int m,int n){
while(m!=n){
if(m>n){
m -= n;
}else{
n -= m;
}
}
return m;
}
3.辗转相除法
让两个数中的大数对小数取余,再将小数赋予大数,结果赋予小数,重复以上动作直至两数其中一个数为零,那么另一个就是最大公约数(其实也不用考虑谁大谁小)
int gcd(int m,int n){
int t = m%n;
while(m%n){
m = n;
n = t;
t = m%n;
}
return n;
}
要是遇到求最简分数,就分子分母同时除以最大公约数。