WUSTOJ 1304: 最大最小公倍数(Java)

题目链接:🔗1304: 最大最小公倍数

Description

已知一个正整数NN,问从1N1 \sim N中任选出三个数,他们的最小公倍数最大可以为多少。

Input

输入一个正整数NN3N1063 \leqslant N \leqslant 10^6

Output

输出一个整数,表示你找到的最小公倍数。

Sample Input

9

Sample Output

504

分析💬

1n1 \sim n最大的三个互质的数的乘积就是结果。

这里要用到2个结论(证明):

  1. 任意两个相邻的正整数互质
  2. 任意两个相邻的正奇数互质

因此

  1. nn为奇数时,ans=n(n1)(n2)ans=n*(n-1)*(n-2),这三个数两两互质

  2. nn为偶数时,nn1n2n,n-1,n-2三个数中的nnn2n-2都是偶数,不互质,因此需要将其中一个数变为奇数。
    若将最小n2n-2变为n3n-3,那么nnn3n-3有可能都是33的倍数,那就不互质了,因此需要判断nn是否是33的倍数。
    nn33的倍数,就将nn变为n3n-3,则ans=(n1)(n2)(n3)ans=(n-1)*(n-2)*(n-3)
    若不是33的倍数,就将n2n-2变为n3n-3,则ans=n(n1)(n3)ans=n*(n-1)*(n-3)

代码💻

/**
 * Time 224ms
 * @author wowpH
 * @version 1.1
 * @date 2019年6月9日下午10:51:26
 * Environment:	Windows 10
 * IDE Version:	Eclipse 2019-3
 * JDK Version:	JDK1.8.0_112
 */

import java.io.InputStreamReader;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(new InputStreamReader(System.in));
		long n, ans;
		while (sc.hasNext()) {
			n = sc.nextInt();
			if (1 == (n % 2)) {// n是奇数
				ans = n * (n - 1) * (n - 2);
			} else if (0 == (n % 3)) {// n是偶数且是3的倍数
				ans = (n - 1) * (n - 2) * (n - 3);
			} else {// n是偶数但不是3的倍数
				ans = n * (n - 1) * (n - 3);
			}
			System.out.println(ans);
		}
		sc.close();
	}
}


结论:任意两个相邻的正整数互质

证:设两个正整数分别为n,n+1
    假设它们不互质,那么存在一个公约数a(a>1),使得n%a=0和(n+1)%a=0成立。
    因为n%a=0成立,于是(n+1)%a=1成立,与假设相矛盾。
    故假设不成立,原结论成立。

结论:任意两个相邻的正奇数互质

证:设两个正奇数为n,n+2
	假设它们不互质,那么存在一个公约数a(a>1),使得n%a=0和(n+2)%a=0成立
	因为n%a=0,因此(n+2)%a=2成立
	要想与假设不矛盾,那么a必须为2,于是n为偶数,与题意相矛盾。
	故假设不成立,原结论成立

版权声明:

  1. 转载请于首页注明链接形式的WUSTOJ 1304: 最大最小公倍数(Java)——wowpH
  2. 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
  3. 如果有疑问欢迎评论区留言,尽量解答;
  4. 如果有错误,还望大侠评论区指正。

posted @ 2019-06-10 01:08  wowpH  阅读(277)  评论(0编辑  收藏  举报