N的范围是1~10E6
自己的想法是:N 的范围比较大,自己可以选出范围内最大的那个质数Z,然后再乘以范围最大的连个不同的数,就可以得出最大的 最小公倍数。错误第一个,这样的三个数直接相乘得到其最小公倍数,要求是这三个数必须两两互质,但是自己求出的三个数可能只满足 质数Z和其他两个数互质,但是其他的两个数不一定互质,所以求出的这个数不一定是 三个数的 最小公倍数。在把1~10E6范围内的质数打表找出来(因为没有走心思考过质数打表的过程,所以没有想起那个简化的方法
int vis[MAX], prime[MAX];
void FileterPrime(int n){
memset(vis, 0, sizeof(vis));
for(int i = 2; i <= n; i++)if(!vis[i]){
for(int j = 2; j * i <= n; j++)vis[j*i] = 1;
}
for(int i = 2; i <= n; i++)if(!vis[i]){
prime[c++] = i;
}
}
) 注意该质数可能就是在倒数的几个大数范围内。超时。。。。
不打表了,直接倒着求最大的质数吧(
bool is_prime(int n){
for(int i = 2; i * i <= n; i++){
if(n % i == 0){
return false;
}
}
return true;
}
时间复杂度:sqrt(n)
)还是不行。
再针对这到题:思路最开始的思路就出现很大的差错,包括这三个数的选择,以及三个数的求最小公倍数的方法。
具体的分析:首先明确相邻的两个整数 和 相邻的两个奇数 一定互质;
1. 当N为奇数的时候,对于n , (n-1), (n-2),两个奇数一个偶数 三个数两两互质,则最小的公倍数为 n* (n-1)*(n-2);
2. 当N为偶数的时候,我们炫耀选择三个数,按照最优的原则来 先选择最大的 n ,然后就不能选择(n-2)了(因为有共同的公约数2); 接下来的两个数则为(n-1),(n-3);n 与 (n-1)、(n-1)与(n-3)一定互质。那么 n 与(n-3)呢?? 互质需要保证 n%3 != 0; 如果为0 ,则分为下一种情况 (n-1)*(n-2)*(n-3)(与第一种分析同样 );
3. 需要注意的是当N 为1 或者 2 的时候,单独判断输出;
这段代码可以AC
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int main(){
int T;
scanf("%d",&T);
ll n, num;
while(T--){
scanf("%lld",&n);
if( n <= 2){
printf("2\n");
continue;
}
else if(n % 2)
num = n*(n-1)*(n-2);
else if(n%3 == 0)
num = (n-1)*(n-2)*(n-3);
else
num = n*(n-1)*(n-3);
printf("%lld\n",num);
}
return 0;
}