算法訓練 最大最小公倍數
時間限制: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; }