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 }