求最小公倍数和最大公约数--辗转相除法/更相减损术

时间:2022-08-04 00:29:51
 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 }