33,028
社区成员
发帖
与我相关
我的任务
分享#include <stdio.h>
#define MAX 1000001
int prime[MAX];
__int64 lcm = 0;
void PrimeNum()
{
int i, j;
for(i = 0; i < MAX; i++)
prime[i] = 1;
for(i = 2; i*i < MAX; i++)
{
if(prime[i]==1)
{
for(j=2*i; j<MAX; j+=i)
prime[j] = 0;
}
}
}
__int64 Gcd(__int64 m, __int64 n)
{
__int64 r;
if(m < n)
{
r = m;
m = n;
n = r;
}
while(n != 0)
{
r = m%n;
m = n;
n = r;
}
return m;
}
void Feasible(__int64 result[])
{
__int64 gcd, temp;
gcd = Gcd(Gcd(result[0], result[1]), result[2]);
temp = result[0]*result[1]*result[2] / gcd;
if(temp > lcm) lcm = temp;
}
void Greedy(__int64 n)
{
__int64 result[3]={n,n-1,n-2};
__int64 i, m, k=n, temp;
Feasible(result);
for(m = 2; m>=0; m--)
{
for(i = n-3; prime[i]==0; i--)
{
result[m] = i;
Feasible(result);
}
result[0] = n;
result[1] = n-1;
result[2] = n-2;
}
while(prime[k]==0) k--;
temp = n*(n-1)*k;
if(temp > lcm) lcm = temp;
printf("%I64d", lcm);
}
int main()
{
__int64 n;
scanf("%I64d", &n);
PrimeNum();
Greedy(n-1);
system("pause");
return 0;
}
三个数的gcd 和2个数的不一样......5,6,10 按你说的是1, 那么最小公倍数就是5*6*10=300, 其实是300/2 = 150[/quote]
我都说了。gcd和lcm的定义没问题。是gcd(a,b,c)=a*b*c/lcm(a,b,c)这个结论对于3个或以上数是不对的![/quote]
gcd(a,b,c) = a*b*c / lcm(a,b,c) 不说3个以上,就说3个它就是适用的!![/quote]
错的就是错的。你再坚持我也没办法。你自己都给出反例了。[/quote]
“gcd(a,b,c)=gcd(gcd(a,b),c)”你三个数的最大公约数都求错了,还来谈lcm
三个数的gcd 和2个数的不一样......5,6,10 按你说的是1, 那么最小公倍数就是5*6*10=300, 其实是300/2 = 150[/quote]
我都说了。gcd和lcm的定义没问题。是gcd(a,b,c)=a*b*c/lcm(a,b,c)这个结论对于3个或以上数是不对的![/quote]
gcd(a,b,c) = a*b*c / lcm(a,b,c) 不说3个以上,就说3个它就是适用的!![/quote]
错的就是错的。你再坚持我也没办法。你自己都给出反例了。