蓝桥杯 ALGO-2 最大最小公倍数
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
分析:贪心算法,尽量找到三个数两两互质所得的最小公倍数就是最大的。
若n,n-1,n-2两两互质,则最小公倍数就是三者的乘积。
数论知识有,任意大于1的两个相邻的自然数互质。
若n为奇数,则n-1是偶数,n-2是奇数;那么2就不是它们的公约数,又这三个数相邻,所以大于2的数都不可能成为它们的公约数,因此最小公倍数就是这三个数的乘积。
若n为偶数,则n-1是奇数,n-2是偶数;那按照n(n-1)(n-2)来计算是不行的,那么就改成n(n-1)(n-3),如果这三个数两两互质就输出。
但是因为n与n-3相差3,那么一个数可以被3整除,另一个也是可以;又因为n为偶数,n-3为奇数,所以2不可能成为它们的公因子;对于大于3的数,就不可能成为这三个数的公约数,因此只需再对3进行判断。
如果n能整除3,那么,n(n-1)(n-3)就肯定不行了,因为n和n-3有了公约数3,最小公倍数肯定比较小了,那么就只能继续判下一个即n(n-1)(n-4)而这样n-4又是偶数,不行,继续下一个n(n-1)(n-5) = n^3 -6n^2 + 5n 而如果这个可以 那个其值肯定要小于(n-1)(n-2)(n-3) = n^3 -6n^2+11n-6(对于n>1来说都成立),而(n-1)(n-2)(n-3)由上一个奇数结论可知是一个符合要求的,因此到n-5就不用判断了。直接选答案为(n-1)(n-2)*(n-3);
而n不能整除3,那么结果就是n(n-1)(n-3),因为n和n-3都不能整除3,此时n-1能不能整除3都无关紧要了。而对于其它数 都是不可能的。上面已证。
import java.util.Scanner;
public class Main {
public static void main(String ars[]){
Scanner sc = new Scanner(System.in);
long n = sc.nextInt();
sc.close();
if(n==1){
System.out.println(1);
}
else{
if(n==2){
System.out.println(2);
}else {
if(n%2 != 0){
long result1 = n*(n-1)*(n-2);
System.out.println(result1);
}else{
if(n%3 != 0){
long result2 = n*(n-1)*(n-3);
System.out.println(result2);
}else{
long result3 = (n-3)*(n-1)*(n-2);
System.out.println(result3);
}
}
}
}
}
}