最大最小公倍数

蓝桥杯 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);
					}
				}
			}
		}
	}

}
原文地址:https://www.cnblogs.com/AIchangetheworld/p/12849570.html