问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
问题分析
本人lowb,一眼看题思路就是遍历,先取N和N-1再从N到小找没有公因子的最大数,最后相乘得结果
贴初始代码(劣质,可跳过)
#include<cstdio>
#include<cmath>
using namespace std;
const int Max=100010;
//函数记录n以内质数
int sushu(int n,int *a)
{
a[0]=2;
int sum=1;//数组中元素个数
for(int i=3;i<=n+1;i+=2)
{
int flag=0;
for(int j=0;j<sum;j++)
if(i%a[j]==0)
{
flag=1;
break;
}
if(!flag)
a[sum++]=i;
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
int a[Max];
int len=sushu(sqrt(n),a);
if(n<=2)
{
printf("%d",n);
return 0;
}
long long x=n-1,y=n,temp;
for(int i=n-2;i>0;i--)//从大到小找
{
temp=i;
int flag=0;
for(int j=0;j<len;j++)
if((x%a[j]==0&&i%a[j]==0)||(y%a[j]==0&&i%a[j]==0))//判断有无公因子
{
flag=1;
break;
}
if(!flag)
break;
}
printf("%lld",temp*x*y);
return 0;
}
然鹅---
有些情况的数据会得错误结果
最后60分
留下了不学无术的眼泪
然后我借鉴了一下大佬们的思路
发现问题关键——>相邻两奇数为质数,再分N的奇偶结果就明了
分两种情况:
N为奇数时,结果最大就是N*(N-1)*(N-2).可自行思考判断
N为偶数时,1.不能整除3时,则为N*(N-1)(N-3)
2.N为3的倍数时,第三个数均不可取N-3,N-4(与N分别有3,2公因子)再往下为取N-5无论成不成立计算出 结果均小于(N-1)*(N-2)*(N-3)(N-1此时为奇数同上判断)。所以此情况结果即(N-1)*(N-2)*(N-3)。
新代码:
#include<cstdio>
using namespace std;
int main()
{
long long n,temp;
while(scanf("%lld",&n)==1)
{
if(n <= 2)
temp = n;
else if(n % 2)
temp = n * (n - 1) * (n - 2);
else
{
if(n%3)
temp = n * (n-1) * (n-3);
else
temp=(n-1) * (n-2) * (n-3);
}
printf("%lld\n",temp);
}
return 0;
}
最后100分通过~~
通往成功的道路布满荆棘,但是勇往直前就一定会有收获,怀挺!