Description
盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:
老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?
Input
首先是一个正整数
T
,表示有
T
组测试数据
每组测试数据是一个正整数n(1<=n<=10^6)
Output
对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行
Sample Input
2
9
7
9
7
Sample Output
504
210
题目链接: http://ccpc.ahu.edu.cn:8080/OJ/Problem.aspx?id=739
AC代码:
#include<stdio.h>
int main()
{
int T,i;
scanf("%d",&T);
__int64 n; //注意题目的要求范围,试用临界点是否满足数位不够用长长整型
while(T--){ //遇到组数的最好用T--的方法,不是遇到scanf函数为特别的值的问题可以不用scanf的值来终止
scanf("%I64d",&n);
//for(j=0;j<n;j++){
// a[j]=j;
//}
if(n==1) printf("1\n");
else if(n==2) printf("2\n");
else if(n%2!=0) printf("%I64d\n",n*(n-1)*(n-2)); //同样也是分为奇偶讨论,在偶数状态时是否为3的倍数也在讨论的范围内。
else { if(n%3!=0) printf("%I64d\n",n*(n-1)*(n-3));
else printf("%I64d\n",(n-3)*(n-1)*(n-2)); //长长整形输出是用%I64d
}
// n=0;
}
return 0;
}
要点:
题目算法不难,但要考虑周到有点困难。不要只向着某一个思维点,这个题目不同情况下如何取最大值是要点,要想到退位数比除二更大
注意:
尝试样例输出时必须要尝试临界条件上的点是否满足。不能只针对所给的样列输出