算法1设计思路:辗转相除法
(1).判断两个数的大小,b比a小不用换,否则互换位置
(2)利用递归,大的数除以小的数,若余数不为0,则让较小的数(b)做被除数,余数(k)做除数,直到k=0,此时b为最大公约数
运用递归将求余之后的值作为b,将之前的b作为a直到求余值为0位置结束循环
(3)两数相乘/最大公约数就是最小公倍数
算法2设计思路:辗转相减法
(1)判断两个数的大小,b比a小不用换,否则互换位置
(2)用大的数减去小的数,若差不为0,则让较小的数(b)做被减数,差做减数,直到差为0,此时b为最大公约数
(3)两数相乘/最大公约数就是最小公倍数
算法1源代码:
import java.util.Scanner;
public class zuoye2_1 {
public static void main(String[] args){
//定义两个整数型
int a;
int b;
//调用java.util.Scanner可以获得从键盘输入的数字
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数:");
a=sc.nextInt();//nextInt()方法用来获取int数
System.out.println("请输入另一个数:");
b=sc.nextInt();
/*调用后面的静态方法最大公约数Max(),最小公倍数Min(),
* 判断两个数的大小,b比a小不用换,否则互换位置
*/
if(a<b){
int temp=b;
b=a;
a=temp;
}
System.out.println("最大公约数为:"+Max(a,b));
System.out.println("最小公倍数为:"+Min(a,b));
}
//求两个数的最大公约数
public static int Max(int a,int b){
//利用递归,大的数除以小的数,若余数不为0,则让较小的数(b)做被除数,余数(k)做除数,直到k=0,此时b为最大公约数
//运用递归将求余之后的值作为b,将之前的b作为a直到求余值为0位置结束循环
while(a%b!=0){
int k=a%b;
a=b;
b=k;
}
return b;
}
//求两个数的最小公倍数
public static int Min(int a,int b){
//最小公倍数就是两个数相乘再除以最大公约数
return a*b/Max(a,b);
}
}
算法2源代码:
import java.util.Scanner;
public class zuoye2_2 {
public static void main(String[] args){
//定义两个整数型
int a;
int b;
//调用java.util.Scanner可以获得从键盘输入的数字
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数:");
a=sc.nextInt();//nextInt()方法用来获取int数
System.out.println("请输入另一个数:");
b=sc.nextInt();
/*调用后面的静态方法最大公约数Max(),最小公倍数Min(),
* 判断两个数的大小,b比a小不用换,否则互换位置
*/
if(a<b){
int temp=b;
b=a;
a=temp;
}
System.out.println("最大公约数为:"+Max(a,b));
System.out.println("最小公倍数为:"+Min(a,b));
}
//求两个数的最大公约数
public static int Max(int a,int b){
//利用递归,大的数除以小的数,若余数不为0,则让较小的数(b)做被除数,余数(k)做除数,直到k=0,此时b为最大公约数
//运用递归将求余之后的值作为b,将之前的b作为a直到求余值为0位置结束循环
while(a-b!=0){
int temp=a-b;
a=b;
b=temp;
}
return b;
}
//求两个数的最小公倍数
public static int Min(int a,int b){
//最小公倍数就是两个数相乘再除以最大公约数
return a*b/Max(a,b);
}
}
算法1程序流程图:
算法2程序流程图:
算法一测试截屏:
算法二:测试截屏