n个数中求指定的位数的最大最小公倍数

一起来玩玩呗 2013-11-14 11:40:39
题目如上,现在要求在n 个数中求3个数的最大最小公倍数

#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;
}



我的想法是从最大往最小依次试探,试探到小于n 的第一个质数为止,因为一个质数无论和谁组合最大公约数都是1, 所以公倍数的值应该是最大的,各位看看我上面的代码,和思路,多提点意见,最好是可以给出测试数据
...全文
449 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
nice_cxf 2013-11-18
  • 打赏
  • 举报
回复
引用 25 楼 q745401990 的回复:
[quote=引用 24 楼 nice_cxf 的回复:] lcm(a,b,c) = a*b*c/gcd(a,b,c) ,显然错的啊 3,4,8 ,lcm=24 ,gcd=1,这个公式显然不对啊
gcd(a,b,c) 求得的gcd 是4 而不是 1[/quote] 3,4,8的最大公约数是4 。。。。自己去查最大公约数定义把。。。。。
一起来玩玩呗 2013-11-18
  • 打赏
  • 举报
回复
引用 24 楼 nice_cxf 的回复:
lcm(a,b,c) = a*b*c/gcd(a,b,c) ,显然错的啊 3,4,8 ,lcm=24 ,gcd=1,这个公式显然不对啊
gcd(a,b,c) 求得的gcd 是4 而不是 1
nice_cxf 2013-11-18
  • 打赏
  • 举报
回复
lcm(a,b,c) = a*b*c/gcd(a,b,c) ,显然错的啊 3,4,8 ,lcm=24 ,gcd=1,这个公式显然不对啊
一起来玩玩呗 2013-11-18
  • 打赏
  • 举报
回复
引用 22 楼 FancyMouse 的回复:
[quote=引用 21 楼 q745401990 的回复:] [quote=引用 20 楼 FancyMouse 的回复:] [quote=引用 19 楼 q745401990 的回复:] [quote=引用 18 楼 FancyMouse 的回复:] [quote=引用 15 楼 q745401990 的回复:] [quote=引用 12 楼 FancyMouse 的回复:] [quote=引用 10 楼 q745401990 的回复:] [quote=引用 7 楼 FancyMouse 的回复:] 我都说了。gcd和lcm的定义没问题。是gcd(a,b,c)=a*b*c/lcm(a,b,c)这个结论对于3个或以上数是不对的!
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 [/quote]你把gcd用质因子分解的表示法写出来以后就能证明我这个式子。 “错的就是错的。你再坚持我也没办法。” 不说第三遍。[/quote] 举个例子,a,b,c,的值是2,5,2, 它们的gcd=2, 按照gcd(gcd(a,b),c) 是1....这怎么解释?[/quote] gcd(2,5,2)=1[/quote] 那lcm 等于多少了?[/quote] 10[/quote] 我是通过lcm(a,b,c) = a*b*c/gcd(a,b,c) 来求得的....而你觉得这个公式是错的 我真心不知道错在哪了?
FancyMouse 2013-11-18
  • 打赏
  • 举报
回复
引用 21 楼 q745401990 的回复:
[quote=引用 20 楼 FancyMouse 的回复:] [quote=引用 19 楼 q745401990 的回复:] [quote=引用 18 楼 FancyMouse 的回复:] [quote=引用 15 楼 q745401990 的回复:] [quote=引用 12 楼 FancyMouse 的回复:] [quote=引用 10 楼 q745401990 的回复:] [quote=引用 7 楼 FancyMouse 的回复:] 我都说了。gcd和lcm的定义没问题。是gcd(a,b,c)=a*b*c/lcm(a,b,c)这个结论对于3个或以上数是不对的!
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 [/quote]你把gcd用质因子分解的表示法写出来以后就能证明我这个式子。 “错的就是错的。你再坚持我也没办法。” 不说第三遍。[/quote] 举个例子,a,b,c,的值是2,5,2, 它们的gcd=2, 按照gcd(gcd(a,b),c) 是1....这怎么解释?[/quote] gcd(2,5,2)=1[/quote] 那lcm 等于多少了?[/quote] 10
fistlongak 2013-11-18
  • 打赏
  • 举报
回复
或者写成这样lcm(a,b,c) = (Lcm(a,b) * c) / Gcd(Lcm(a,b),c);这样比较好理解.
fistlongak 2013-11-18
  • 打赏
  • 举报
回复
引用 26 楼 nice_cxf 的回复:
[quote=引用 25 楼 q745401990 的回复:] [quote=引用 24 楼 nice_cxf 的回复:] lcm(a,b,c) = a*b*c/gcd(a,b,c) ,显然错的啊 3,4,8 ,lcm=24 ,gcd=1,这个公式显然不对啊
gcd(a,b,c) 求得的gcd 是4 而不是 1[/quote] 3,4,8的最大公约数是4 。。。。自己去查最大公约数定义把。。。。。[/quote] 3个数的最小公倍数是lcm(a,b,c) = (a*b*c * Gcd(Gcd(a, b), c)) / (Gcd(a, b) * Gcd(b, c) * Gcd(a, c)); 这其实就是个集合的问题.
一起来玩玩呗 2013-11-17
  • 打赏
  • 举报
回复
引用 18 楼 FancyMouse 的回复:
[quote=引用 15 楼 q745401990 的回复:] [quote=引用 12 楼 FancyMouse 的回复:] [quote=引用 10 楼 q745401990 的回复:] [quote=引用 7 楼 FancyMouse 的回复:] 我都说了。gcd和lcm的定义没问题。是gcd(a,b,c)=a*b*c/lcm(a,b,c)这个结论对于3个或以上数是不对的!
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 [/quote]你把gcd用质因子分解的表示法写出来以后就能证明我这个式子。 “错的就是错的。你再坚持我也没办法。” 不说第三遍。[/quote] 举个例子,a,b,c,的值是2,5,2, 它们的gcd=2, 按照gcd(gcd(a,b),c) 是1....这怎么解释?
一起来玩玩呗 2013-11-17
  • 打赏
  • 举报
回复
引用 20 楼 FancyMouse 的回复:
[quote=引用 19 楼 q745401990 的回复:] [quote=引用 18 楼 FancyMouse 的回复:] [quote=引用 15 楼 q745401990 的回复:] [quote=引用 12 楼 FancyMouse 的回复:] [quote=引用 10 楼 q745401990 的回复:] [quote=引用 7 楼 FancyMouse 的回复:] 我都说了。gcd和lcm的定义没问题。是gcd(a,b,c)=a*b*c/lcm(a,b,c)这个结论对于3个或以上数是不对的!
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 [/quote]你把gcd用质因子分解的表示法写出来以后就能证明我这个式子。 “错的就是错的。你再坚持我也没办法。” 不说第三遍。[/quote] 举个例子,a,b,c,的值是2,5,2, 它们的gcd=2, 按照gcd(gcd(a,b),c) 是1....这怎么解释?[/quote] gcd(2,5,2)=1[/quote] 那lcm 等于多少了?
FancyMouse 2013-11-17
  • 打赏
  • 举报
回复
引用 15 楼 q745401990 的回复:
[quote=引用 12 楼 FancyMouse 的回复:] [quote=引用 10 楼 q745401990 的回复:] [quote=引用 7 楼 FancyMouse 的回复:] 我都说了。gcd和lcm的定义没问题。是gcd(a,b,c)=a*b*c/lcm(a,b,c)这个结论对于3个或以上数是不对的!
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 [/quote]你把gcd用质因子分解的表示法写出来以后就能证明我这个式子。 “错的就是错的。你再坚持我也没办法。” 不说第三遍。
FancyMouse 2013-11-17
  • 打赏
  • 举报
回复
引用 16 楼 q745401990 的回复:
[quote=引用 13 楼 FancyMouse 的回复:] [quote=引用 11 楼 FancyMouse 的回复:] [quote=引用 9 楼 q745401990 的回复:] [quote=引用 8 楼 FancyMouse 的回复:] 而且就你这个题,n是奇数的话显然应该选n,n-1,n-2。n是偶数的话选n,n-1,n-3。lcm都是3个数的乘积,没可能做得更优了。根本就不用去搜。
12,11,10,9 的情况...按你的说选12,10,9的lcm是396, 11*10*9 > 396[/quote] 我选的是12,11,9。你n-1怎么算出来10的?[/quote] 哦不过我这点的确有问题。n是6的倍数的话就不能选n,n-1,n-3了,估计要n-1,n-2,n-3[/quote] 16,15,14,13,12, n不是6的倍数,这里选的却是n,n-1,n-3,而不是n-1,n-2,n-3..........希望你先考虑清楚了,再说出你的想法...[/quote] 希望你语文能学得更好一点。我选n-1,n-2,n-3的条件是n是6的倍数。n不是6的倍数但是是偶数当然选到n,n-1,n-3上。
FancyMouse 2013-11-17
  • 打赏
  • 举报
回复
引用 19 楼 q745401990 的回复:
[quote=引用 18 楼 FancyMouse 的回复:] [quote=引用 15 楼 q745401990 的回复:] [quote=引用 12 楼 FancyMouse 的回复:] [quote=引用 10 楼 q745401990 的回复:] [quote=引用 7 楼 FancyMouse 的回复:] 我都说了。gcd和lcm的定义没问题。是gcd(a,b,c)=a*b*c/lcm(a,b,c)这个结论对于3个或以上数是不对的!
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 [/quote]你把gcd用质因子分解的表示法写出来以后就能证明我这个式子。 “错的就是错的。你再坚持我也没办法。” 不说第三遍。[/quote] 举个例子,a,b,c,的值是2,5,2, 它们的gcd=2, 按照gcd(gcd(a,b),c) 是1....这怎么解释?[/quote] gcd(2,5,2)=1
一起来玩玩呗 2013-11-16
  • 打赏
  • 举报
回复
引用 3 楼 q745401990 的回复:
[quote=引用 2 楼 FancyMouse 的回复:] 最大公倍数根本就没这东西。 lcm(a,b)=a*b/gcd(a,b)不代表lcm(a,b,c)=a*b*c/gcd(a,b,c) gcd(a,b,c)=gcd(gcd(a,b),c)。lcm也类似。用这个算。
在1~n 个数中,假设n 为10, 在中间任取三个数,求得最小公倍数,要求得出的最小公倍数是n 个数中三个数组合最大的,即最大最小公倍数 你求三个数的最小公倍数“gcd(a,b,c)=gcd(gcd(a,b),c)。lcm也类似。用这个算” 这样算gcd 本身就是错的,比如5,6,10, 那么你算出的gcd 是 1,其实是 2.[/quote] 最大公约数错了 最小公倍数就不用说了
一起来玩玩呗 2013-11-16
  • 打赏
  • 举报
回复
引用 2 楼 FancyMouse 的回复:
最大公倍数根本就没这东西。 lcm(a,b)=a*b/gcd(a,b)不代表lcm(a,b,c)=a*b*c/gcd(a,b,c) gcd(a,b,c)=gcd(gcd(a,b),c)。lcm也类似。用这个算。
在1~n 个数中,假设n 为10, 在中间任取三个数,求得最小公倍数,要求得出的最小公倍数是n 个数中三个数组合最大的,即最大最小公倍数 你求三个数的最小公倍数“gcd(a,b,c)=gcd(gcd(a,b),c)。lcm也类似。用这个算” 这样算gcd 本身就是错的,比如5,6,10, 那么你算出的gcd 是 1,其实是 2.
一起来玩玩呗 2013-11-16
  • 打赏
  • 举报
回复
引用 13 楼 FancyMouse 的回复:
[quote=引用 11 楼 FancyMouse 的回复:] [quote=引用 9 楼 q745401990 的回复:] [quote=引用 8 楼 FancyMouse 的回复:] 而且就你这个题,n是奇数的话显然应该选n,n-1,n-2。n是偶数的话选n,n-1,n-3。lcm都是3个数的乘积,没可能做得更优了。根本就不用去搜。
12,11,10,9 的情况...按你的说选12,10,9的lcm是396, 11*10*9 > 396[/quote] 我选的是12,11,9。你n-1怎么算出来10的?[/quote] 哦不过我这点的确有问题。n是6的倍数的话就不能选n,n-1,n-3了,估计要n-1,n-2,n-3[/quote] 16,15,14,13,12, n不是6的倍数,这里选的却是n,n-1,n-3,而不是n-1,n-2,n-3..........希望你先考虑清楚了,再说出你的想法...
一起来玩玩呗 2013-11-16
  • 打赏
  • 举报
回复
引用 12 楼 FancyMouse 的回复:
[quote=引用 10 楼 q745401990 的回复:] [quote=引用 7 楼 FancyMouse 的回复:] [quote=引用 6 楼 q745401990 的回复:] [quote=引用 5 楼 FancyMouse 的回复:] [quote=引用 3 楼 q745401990 的回复:] [quote=引用 2 楼 FancyMouse 的回复:] 最大公倍数根本就没这东西。 lcm(a,b)=a*b/gcd(a,b)不代表lcm(a,b,c)=a*b*c/gcd(a,b,c) gcd(a,b,c)=gcd(gcd(a,b),c)。lcm也类似。用这个算。
在1~n 个数中,假设n 为10, 在中间任取三个数,求得最小公倍数,要求得出的最小公倍数是n 个数中三个数组合最大的,即最大最小公倍数 你求三个数的最小公倍数“gcd(a,b,c)=gcd(gcd(a,b),c)。lcm也类似。用这个算” 这样算gcd 本身就是错的,比如5,6,10, 那么你算出的gcd 是 1,其实是 2.[/quote] 5又除不尽2,gcd怎么可能是2[/quote] 三个数的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
一起来玩玩呗 2013-11-16
  • 打赏
  • 举报
回复
引用 11 楼 FancyMouse 的回复:
[quote=引用 9 楼 q745401990 的回复:] [quote=引用 8 楼 FancyMouse 的回复:] 而且就你这个题,n是奇数的话显然应该选n,n-1,n-2。n是偶数的话选n,n-1,n-3。lcm都是3个数的乘积,没可能做得更优了。根本就不用去搜。
12,11,10,9 的情况...按你的说选12,10,9的lcm是396, 11*10*9 > 396[/quote] 我选的是12,11,9。你n-1怎么算出来10的?[/quote] 哦 这里写快了,那么按你说的12,11,10,9,你选12,11,9他们的公倍数 < 11,10,9
FancyMouse 2013-11-16
  • 打赏
  • 举报
回复
引用 11 楼 FancyMouse 的回复:
[quote=引用 9 楼 q745401990 的回复:] [quote=引用 8 楼 FancyMouse 的回复:] 而且就你这个题,n是奇数的话显然应该选n,n-1,n-2。n是偶数的话选n,n-1,n-3。lcm都是3个数的乘积,没可能做得更优了。根本就不用去搜。
12,11,10,9 的情况...按你的说选12,10,9的lcm是396, 11*10*9 > 396[/quote] 我选的是12,11,9。你n-1怎么算出来10的?[/quote] 哦不过我这点的确有问题。n是6的倍数的话就不能选n,n-1,n-3了,估计要n-1,n-2,n-3
FancyMouse 2013-11-16
  • 打赏
  • 举报
回复
引用 10 楼 q745401990 的回复:
[quote=引用 7 楼 FancyMouse 的回复:] [quote=引用 6 楼 q745401990 的回复:] [quote=引用 5 楼 FancyMouse 的回复:] [quote=引用 3 楼 q745401990 的回复:] [quote=引用 2 楼 FancyMouse 的回复:] 最大公倍数根本就没这东西。 lcm(a,b)=a*b/gcd(a,b)不代表lcm(a,b,c)=a*b*c/gcd(a,b,c) gcd(a,b,c)=gcd(gcd(a,b),c)。lcm也类似。用这个算。
在1~n 个数中,假设n 为10, 在中间任取三个数,求得最小公倍数,要求得出的最小公倍数是n 个数中三个数组合最大的,即最大最小公倍数 你求三个数的最小公倍数“gcd(a,b,c)=gcd(gcd(a,b),c)。lcm也类似。用这个算” 这样算gcd 本身就是错的,比如5,6,10, 那么你算出的gcd 是 1,其实是 2.[/quote] 5又除不尽2,gcd怎么可能是2[/quote] 三个数的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] 错的就是错的。你再坚持我也没办法。你自己都给出反例了。
FancyMouse 2013-11-16
  • 打赏
  • 举报
回复
引用 9 楼 q745401990 的回复:
[quote=引用 8 楼 FancyMouse 的回复:] 而且就你这个题,n是奇数的话显然应该选n,n-1,n-2。n是偶数的话选n,n-1,n-3。lcm都是3个数的乘积,没可能做得更优了。根本就不用去搜。
12,11,10,9 的情况...按你的说选12,10,9的lcm是396, 11*10*9 > 396[/quote] 我选的是12,11,9。你n-1怎么算出来10的?
加载更多回复(8)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧