1 package com.cskaoyan.JavaClaasic; 2 import java.util.Scanner;
3 /*题目:输入两个正整数m和n,求其最大公约数和最小公倍数*/ 6 public class JavaClassic6 { 7 8 public static void main(String[] args) 9 { 10 Scanner sc = new Scanner(System.in); 11 System.out.println("请输入第一个整数:"); 12 int m = sc.nextInt(); 13 System.out.println("请输入第二个整数:"); 14 int n = sc.nextInt(); 15 16 //1.辗转相除法 + 递归思想(最简单的),但递归效率相对较低 17 System.out.println("最大公约数是:"); 18 System.out.println(zhZh(m , n)); 19 System.out.println("最小公倍数是:"); 20 System.out.println(zhXi(m , n)); 21 22 //普通算法,思想很简单,确定最大最小公倍数范围,然后一个个依次相除 23 pT(m , n); 24 } 25 //辗转相除法 + 递归 (最小公倍数 = 两者乘积 / 最大公约数)//更相减损术 26 public static int zhZh(int x, int y) 27 { 28 if (x < y)//交换x,y次序,保证y始终最小 29 { 30 x = x + y; 31 y = x - y; 32 x = x - y; 33 } 34 if (x % y == 0)//初始情况x=y时直接跳出,返回y 35 { 36 return y; 37 } 38 return zhZh(y , x % y);//保证输入的第二个数为两者最小z,注意次序 39 } 40 public static int zhXi(int x , int y) 41 { 42 return x * y / zhZh(x , y);//最小公倍数 = 两者乘积 / 最大公约数 43 } 44 45 46 //普通算法,遍历除法,最容易想到 47 public static void pT(int m , int n) 48 { 49 if (m < n) 50 {//交换顺序确保if执行完后,n为两者的最小值 51 int temp; 52 temp = m; 53 m = n; 54 n = temp; 55 } 56 for (int i = n ; i > 0 ; i--) 57 { 58 //确定最大公约数的范围,从大往小遍历 59 if ((m % i == 0) && (n % i == 0)) 60 { 61 System.out.println("最大公约数是:"); 62 System.out.println(i); 63 break;//判断到了第一个符合条件的值就跳出当前循环 64 } 65 } 66 for (int i = n; i <= m * n; i++) 67 {//确定最小公倍的范围,从小往大遍历 68 if ((i % m == 0) && (i % n == 0)) 69 { 70 System.out.println("最小公倍数是:"); 71 System.out.println(i); 72 break;//判断到了第一个符合条件的值就跳出来 73 } 74 } 75 } 78 }