一、最大公约数
欧几里得算法又称辗转相除法,用于求两个正整数num1, num2的最大公约数,记作gcd(num1, num2)
算法思想:
1)如果num1 < num2,交换num1, num2值
2)rem=num1 mod num2(即rem的余数),若 rem = 0,算法结束,num2即为答案
3)否则,互换:num1 ← num2,num2←rem,并返回第一步。
//使用欧几里得算法求最大公约数(辗转相除法)
public static int getGcd(int num1, int num2) {
//两个数字num1 > num2
if (num1 < num2) {
int temp = num1;
num1 = num2;
num2 = temp;
}
int rem = -1;
while (num1 % num2 != 0) {
rem = num1 % num2;
num1 = num2;
num2 = rem;
}
return num2;
}
二、最小公倍数
最小公倍数(least common multiple) 记作lcm(num1, num2)
根据最大公倍数求最小公约数
//求最小公倍数
public static int getLcm(int num1, int num2){
return num1 * num2/(getGcd(num1, num2));
}
三、蓝桥杯——核桃的数量
问题描述
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1. 各组的核桃数量必须相同
2. 各组内必须能平分核桃(当然是不能打碎的)
3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)
输入格式
输入包含三个正整数a, b, c,表示每个组正在加班的人数,用空格分开(a,b,c<30)
输出格式
输出一个正整数,表示每袋核桃的数量。
样例输入1
2 4 5
样例输出1
20
样例输入2
3 1 1
样例输出2
3
//穷举法求出最大公倍数
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
int c = scan.nextInt();
int data[] = new int[3];
data[0] = a;
data[1] = b;
data[2] = c;
Arrays.sort(data);
for (int i = data[2]; ; i++) {
if (i % a == 0 && i % b == 0 && i % c == 0) {
System.out.println(i);
break;
}
}
}
}