算法訓練 最大最小公倍數


算法訓練 最大最小公倍數  
時間限制:1.0s   內存限制:256.0MB
       
問題描述

已知一個正整數N,問從1~N中任選出三個數,他們的最小公倍數最大可以為多少。

輸入格式

輸入一個正整數N。

輸出格式
輸出一個整數,表示你找到的最小公倍數。
樣例輸入
9
樣例輸出
504
數據規模與約定

1 <= N <= 106。

 

解題思路:其實看似挺簡單的一道題,但是卻需要分析一番。雖然知道是用貪心法,下面的代碼能ac,但自己的貪心策略遠遠不夠准確,不如最后面的方法簡潔准確。自己的分析能力還是很爛。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#define for(i,x,n) for(int i=x;i<n;i++)
#define ll long long int

using namespace std;

ll gcd(ll a,ll b){
    ll t=a%b;
    while(b){
        a=b;
        b=t;
        if(b==0){
            return a;
        }
        t=a%b;
    }
    return a;
}

int main()
{
    ll n;
    ll maxx=0;
    scanf("%lld",&n);
    if(n%2==1){
        printf("%lld",n*(n-1)*(n-2));
        return 0;
    }else{
        ll t=n*(n-1)/gcd(n,n-1);
        for(i,n-40,n+1){
            ll lcm=t*i/gcd(t,i);
            if(lcm>maxx){
                maxx=lcm;
            }
        }
        t=(n-1)*(n-2)/gcd(n-1,n-2);
        t=t*(n-3)/gcd(t,n-3);
        if(t>maxx){
            maxx=t;
        }
        printf("%lld",maxx);
    }
    return 0;
}

下面是網上的代碼,這是地址

首先確定是從大到小開始看,然后考慮到第一個數是奇數時,奇偶奇,其中兩個奇數中間差2,但奇數沒有因子2。

第一個數是偶數時,n,n-1,n-2是 偶奇偶,這時候兩個偶數之間一定會有公共因子2,然后需要n-2再往后推一個取n-3,即n,n-1,n-3(偶奇奇),但這時候要注意,n,n-3之間可能會有公共因子3,

這時候就需要判斷n能否被3整除,如果可以,n-3也會被3整除,這樣就不能取這三個數了,就不能再取n了,整體往后推一個,取n-1,n-2,n-3.

#include<iostream>  
using namespace std;  
int main()  
{  
    long long n,ans;  
    cin>>n;  
    if(n<=2)  
    ans=n;  
    else if(n%2==1)  
    ans=n*(n-1)*(n-2);  
    else  
    {  
        if(n%3==0)  
        ans=(n-1)*(n-2)*(n-3);  
        else  
        ans=n*(n-1)*(n-3);  
    }  
    cout<<ans<<endl;  
    return 0;  
}   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM