资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
代码实现(运行超时版本)
思路一:依次套用三个for循环,遍历所有随机选取三个数的可能性,找到最小公倍数,再找最大的最小公倍数。但是运行超时。
import java.util.Scanner; public class Main{ public static void main(String args[]) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int maxNum = 1; if(n==1) { maxNum=1; }else if(n==2) { maxNum=2; }else { for(int l=1;l<=n-2;l++) { for(int m=l+1;m<=n-1;m++) { for(int k=m+1;k<=n;k++) { if(findMin(l,m,k)>maxNum) { maxNum = findMin(l,m,k); } } } } } System.out.println(maxNum); } //找三个数的最小公倍数 public static int findMin(int a, int b,int c) { int result = 0; int minAB = Math.min(a, b); int minABC = Math.min(c, minAB); for(int i=minABC;i>0;i++) { if(i%a==0 && i%b==0 && i%c==0) { result = i; break; } } return result; } }
代码实现(正确版)
思路二:求两个数a、b的最小公倍数,无非是找到另外一个数c可以整除这俩数。
(1)要想使得c最大,则max{c} = a*b,即使a、b两数相乘。
(2)而有需要满足最小公倍数的特点,故a、b两数应该都为质数。
(3)要想使得(a*b)尽可能地大,a、b分别需要尽可能地大,同时,a、b需要尽可能地近。
因此:可以从n倒着往前找,尽可能大的连续的两个互为质数相乘,即为所求。
将两个数的问题,类比到三个数的最大最小公倍数问题上,可得出以下结论:
从n个数倒着往前找,尽可能大的连续的3个互为质数相乘,即为所求。
互为质数:两个数的公因数只有1的两个非零自然数,叫做互质数。
思路分析
质数的相关定理:
(a)连续的两个自然数一定互为质数。
(b)相邻的两个奇数一定互为质数。
(c)两个数中较大的数为质数,两个数一定互为质数。
质数情况:
(1)n为奇数时,由(b)可知n与(n-2)一定互为质数,由(a)可知,n与(n-1)一定互为质数。因此n、n-1、n-2三个数最小公倍数为n*(n-1)*(n-2)。
(2)n为偶数时,不能被3整除。由(a)可知n与(n-1)一定互为质数,(n-1)与(n-3)都为奇数,由(b)可知其一定互为质数。因此n、n-1、n-3三个数的最小公倍数为n*(n-1)*(n-3)。
(3)n为偶数时,能被3整除。由(a)可知(n-1)与(n-2)一定互为质数,由(b)可知,(n-2)与(n-3)一定互为质数。因此n-1、n-2、n-3三个数最小公倍数为n*(n-1)*(n-2)。
判断互为质数方法——求商判断法
用大数除以小数,如果除得的余数与其中较小数互质,则原来两个数是互质数。
注意数字类型为long!使用int答案错误!
import java.util.Scanner;
public class MinMaxNum {
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
//注意一定要是long类型,不然答案错误
long n = in.nextLong();
long maxNum = 1;
if(n==1) {
maxNum=1;
}else if(n==2) {
maxNum=2;
}else {
//n为偶数
if(n%2==0) {
//n为偶数且能被3整除
if(n%3==0) {
maxNum = (n-1)*(n-2)*(n-3);
//n为偶数且不能被3整除
}else {
maxNum = n*(n-1)*(n-3);
}
//n为奇数
}else {
maxNum = n*(n-1)*(n-2);
}
}
System.out.println(maxNum);
}
}