First Blood(C语言)

Description


盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:

老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?



Input


首先是一个正整数 T ,表示有 T 组测试数据

每组测试数据是一个正整数n(1<=n<=10^6)


Output


对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行


Sample Input


2
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;
}
要点:

题目算法不难,但要考虑周到有点困难。不要只向着某一个思维点,这个题目不同情况下如何取最大值是要点,要想到退位数比除二更大

注意:

尝试样例输出时必须要尝试临界条件上的点是否满足。不能只针对所给的样列输出


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值