已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入一个正整数N。
1 <= N <= 106。
-------------------------------
解题思路:
最先开始看到数据会有99997*99998*99999 想到用Java中的大数(其实用longlong就行)。
整数N要想最小公倍数最大则三个数必须为质数,从N开始取 N*(N-1)*(n-2) 也是样例 ‘9’=9*8*7=504 采取的解法,由此向下想,如果给出的是8最小公倍数则是8*7*5=280,为什么不是*6而是*5,因为6和8的最小公倍数是24即24*7=168<280,他们有最大公约数2。
所以此题分成两大部分考虑:
给的数是奇数:n*(n-1)*(n-2)
给的数是偶数:n*(n-1)*n(-3)
这里补充一下:若给的数是偶数切偶数能被 3 整除,该解法会出问题,比如30,按照此方法解:30*29*27 这里30和27有最大公约数3(最小公倍数为30*27/3=270)结果为270*29=7830。此时应找出一个解法方法,奇数没有问题,试将原来的n减小为29(奇数状态)29*28*27=21924,经过测试若n为偶数同时n能被3整除,则将n转换为n-1,将n-1当成n即可解决:(n-1)*(n-2)*(n-3)。
题目分析:
本题中注意两个点:1.数据类型 2.对最小公倍数的熟练掌握
AC Code :
1 #include<stdio.h> 2 int main() { 3 long long n,ans; 4 while(scanf("%I64d",&n)!=EOF) { 5 if(n<=2)ans=n; 6 else if(n%2) { 7 ans=n*(n-1)*(n-2); 8 } else { 9 if(n%3) 10 ans=n*(n-1)*(n-3); 11 else 12 ans=(n-1)*(n-2)*(n-3); 13 } 14 printf("%I64d\n",ans); 15 } 16 return 0; 17 }