首先這道題目的測試答案官方是有問題的哈,所以最高只能得到60分
問題描述
已知一個正整數N,問從1~N中任選出三個數,他們的最小公倍數最大可以為多少。
輸入格式
輸入一個正整數N。
輸出格式
輸出一個整數,表示你找到的最小公倍數。
樣例輸入
9
樣例輸出
504
數據規模與約定
1 <= N <= 106。
### 分析
博主傻乎乎的暴力方法搞了半天,無奈唉,數學差,百度了一下發現了數論知識,總結如下:
**1:**若n 和 n-1和n-2 三個數 兩兩互質的話,那么結果就是這三個數的積
**2:**當n是奇數時,n 和n-2都是奇數,n-1是偶數,那么他們三個的公約數肯定不是2,而因為這三個數是連續的,所以大于2的數都不可能成為他們或其中任意兩個數的公約數了.結果就是他們三個的乘積.
**3:**當n為偶數時,n*(n-1)*(n-2)肯定不行了,因為n和n-2都是偶數,那么只能將n-2改成n-3,即n*(n-1)*(n-3),如果這三個數兩兩互質那么肯定就是結果了.
**4:**如果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 -6*n^2 + 5*n 而如果這個可以 那個其值肯定要小于(n-1)*(n-2)*(n-3) = n^3 -6*n^2+11n-6(對于n>1來說都成立),而(n-1)*(n-2)*(n-3)由上一個奇數結論可知是一個符合要求的,因此到n-5就不用判斷了。直接選答案為(n-1)*(n-2)*(n-3);
代碼如下:
~~~
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double n = input.nextDouble();
getMaxCommon(n);
}
private static void getMaxCommon(double n) {
if (n<3) {
System.out.printf("%.0f",n);
}else if (n%2!=0) {
System.out.printf("%.0f",n*(n-1)*(n-2));
}else{
if (n%3!=0) {
System.out.printf("%.0f",n*(n-1)*(n-3));
}else {
System.out.printf("%.0f",(n-3)*(n-1)*(n-2));
}
}
}
}
~~~