已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入一个正整数N。
1 <= N <= 106。
参考:
当n为奇数时,答案一定是n*(n-1)*(n-2)。
当n为偶数时,答案是n*a*b,其中a>=n-3,b>=n-3。
思路:对于n为奇数时则直接得出答案n*(n-1)*(n-2)。
当n为偶数时,则考虑4种情况
同时比较3个数的最小公倍数用递归
long long int max ( long long int m, long long int n){
if(m%n == 0){
return n;
}
return max(n,m%n);
}
long long int max1( long long int m, long long int n, long long int k){
long long int y = m*n*k;
long long int a = max(m,n);
long long int b = max(m*n/a,k);
return y/b;
}
总代码为
#include <stdio.h>
#include <stdlib.h>
long long int s[10];
long long int max ( long long int m, long long int n){
if(m%n == 0){
return n;
}
return max(n,m%n);
}
long long int max1( long long int m, long long int n, long long int k){
long long int y = m*n*k;
long long int a = max(m,n);
long long int b = max(m*n/a,k);
return y/b;
}
int main()
{
long long int n,p,i,q = 0,j,k;
scanf("%I64d",&n);
if(n%2 == 1){
p = n*(n-1)*(n-2);
printf("%I64d\n",p);
}else{
s[0] = max1(n-1,n-2,n-3);
s[1] = max1(n,n-2,n-3);
s[2] = max1(n,n-1,n-3);
s[3] = max1(n,n-1,n-2);
for(i = 0;i<4;i++){
// printf("&&&%I64d\n",s[i]);
if(s[i]>q){
q = s[i];
}
}
printf("%I64d\n",q);
}
return 0;
}