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

一起来玩玩呗 一起来玩玩呗 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
题目如上,现在要求在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, 所以公倍数的值应该是最大的,各位看看我上面的代码,和思路,多提点意见,最好是可以给出测试数据
...全文

相关推荐

评论 28
收藏 已收藏
分享
返回顶部