自然语言描述问题
公约数
公约数,亦称“公因数”。它是指能同时整除几个整数的数 。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。
问题描述
计算两个非负整数a和b的最大公约数:
若b为0,则最大公约数为a。否则,将a除以b得到余数r,a和b的最大公约数即为b和r的最大公约数。
数学描述
编程
递归编程及其思路
使用递归进行编程
- 判断b是否是0如果是零了最大公约数就是a(也就是如果a是b的倍数举个例子如[16与0],[20与0],[11与0]那么8、10、11就分别是这几个数的最大公约数)
- 如果不是就用a除以b获得r,那么a,b最大公约数就是b,r的最大公约数
- 把b当成a,r当成b继续第一个步骤。
代码
public static int gcd(int a, int b){
if(b==0) return a;
int r = a%b;
return gcd(b,r);
}
举个例子执行这串代码:a=16 , b=10;
第一次执行 16%10 = 6; b=10 , r = 6 将b赋值给a,将r赋值给b
第二次执行 10 % 6 = 4; b=6 , r = 4 将b赋值给a,将r赋值给b
第四次执行 6 % 4 = 2 ; b=4 , r = 2 将b赋值给a,将r赋值给b
第五次执行 4 % 2 = 0 ; b=2 , r = 0 将b赋值给a,将r赋值给b
第六次执行 a=2,b=0 弹出数值2
所以16与10的最大公约数为 2
循环编程及其思路
使用循环进行编程
- 判断b是否为0(如果是a为最大公倍数)
- 判断a是否是b的倍数(a能整除b就说明b是最大公倍数如:16与8 ,20与10)
- 使用循环执行a除以b得到r
- 判断r是否为零当r为0时弹出b
- 将b赋值给a,r赋值给b
public static int gcd(int a, int b){
if(b==0) return a;
if(a%b==0) return b;
int r;
while(true){
r = a%b;
if(r==0) return b;
a = b;
b = r;
}
}