1~N中随机选三个数,求其最大的 最小公倍数。

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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值