トピック情報
正の整数Aと正の整数Bの最小公倍数は、AとBで割り切れる最小の正の整数値を指します。入力AとBの最小公倍数を見つけるアルゴリズムを設計します。
入力の説明:2つの数値の間のスペースで区切られた2つの正の整数AとBを入力します
出力の説明:AとBの最小公倍数を出力します。
入力例:5 7
サンプル出力:35
回答
最小公倍数を解くときは、その数の素因数を分解してから、繰り返される因数を取り除く必要があり、残りの因数の積が最小公倍数になります。
たとえば、6 = 2 * 3、8 = 2 * 2 * 2の場合、2つの数が素因数に分解された後、繰り返される因数2があり、繰り返される2が削除され、残りの因数3の積が* 2 * 2 * 2 = 24。最小公倍数です。
コーディング
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
* @最小公倍数
*/
public class LeastCommonMultiple {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
while ((input = br.readLine()) != null) {
String[] arr = input.split(" ");
// 定义list,接受最小公倍数拆解出来的因子
List<Integer> list = new ArrayList<>();
// 将给定的两个数字分解质因数
List<Integer> list1 = resolvePrime(Integer.parseInt(arr[0]));
List<Integer> list2 = resolvePrime(Integer.parseInt(arr[1]));
// 以list1为基准,去除list2中与list1重复的项
for (Integer num : list1) {
list.add(num);
if (list2.contains(num)) {
list2.remove(num);
}
}
// 将list2剩余数据项添加到最小公倍数列表中
for (Integer num : list2) {
list.add(num);
}
// 循环求出最小公倍数
int number = 1;
for (Integer num : list) {
number *= num;
}
System.out.println(number);
}
}
/**
* @分解质因数
* @param num
* @return
*/
public static List<Integer> resolvePrime(int num) {
List<Integer> list = new ArrayList<>();
int start = 2;
// 待数字除的为1时退出
while (num > 1) {
// 若数字可以整除start,说明start为num的因子
// 将商作为新的数字,start置为2
// 重新开始循环
if (num % start == 0) {
num = num/start;
list.add(start);
start = 2;
} else {
// 若不能整除,则start加一,继续循环
start++;
}
}
return list;
}
}