已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
数据规模与约定
1 <= N <= 106。
输入格式:
输入一个正整数N。
输出格式:
输出一个整数,表示你找到的最小公倍数。
输入样例:
在这里给出一组输入。例如:
9
输出样例:
在这里给出相应的输出。例如:
504
思路:好多人都能想到的思路,就是最大的三个数就好了,如果n是奇数就直接最大的三个数相乘就好了,如果是偶数,且最大数不能被三整除,就取n,n-1,n-3;若能被三整除就整体向后移动一个,n-1,n-2,n-3相乘。需要吐槽一点,我第一眼以为数据规模最大是106,然后我就没用这个方法,用的是先求公约数,然后ab的乘积处以公约数,得到的就是最小公倍数,结果就一直在给我报超时,最后想别再是10^6,换成longlong就ac了。不得感叹,啧啧啧。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(void){
ll n;cin>>n;
ll ans=0;
if(n%2){
ans=n*(n-1)*(n-2);
}
else {
if(n%3)
ans=n*(n-1)*(n-3);
else
ans=(n-1)*(n-2)*(n-3);
}
cout<<ans;
return 0;
}
在这里贴上我最开始的代码,比较蠢
#include<bits/stdc++.h>
using namespace std;
int check(int a,int b){
if(a<b){
int temp=a;
a=b;
b=temp;
}
if(!a||!b)
return 0;
int c=a%b;
if(c==0)return b;
while(c){
a=b;
b=c;
c=a%b;
}
return b;
}
int main(void){
int n;cin>>n;
int max=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(i==j)continue;
for(int k=j+1;k<=n;k++){
if(j==k)continue;
else {
int c=i*j/check(i,j);
int d=c*k/check(c,k);
max<d?max=d:max=max;
}
}
}
}
cout<<max;
return 0;
}