n个数中求指定的位数的最大最小公倍数
题目如上,现在要求在n 个数中求3个数的最大最小公倍数
我的想法是从最大往最小依次试探,试探到小于n 的第一个质数为止,因为一个质数无论和谁组合最大公约数都是1, 所以公倍数的值应该是最大的,各位看看我上面的代码,和思路,多提点意见,最好是可以给出测试数据
#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, 所以公倍数的值应该是最大的,各位看看我上面的代码,和思路,多提点意见,最好是可以给出测试数据
...全文
相关推荐
c语言编程操作[收集].pdf
最大公约数和最小公倍数:`fun`函数采用辗转相除法(欧几里得算法)求两个整数的最大公约数,然后通过两个数的乘积除以最大公约数得到最小公倍数。
java基础50题
- **算法思路**:首先计算两个数的最大公约数,然后利用公式`lcm(a, b) = (a * b) / gcd(a, b)`计算最小公倍数。- **实现方法**:使用辗转相除法计算最大公约数。
c语言经典题目-c语言经典题目
### 五、最小公倍数#### 题目描述编写一个程序,求两个正整数的最小公倍数。#### 解析求两个数的最小公倍数可以通过先求它们的最大公约数(gcd),再利用两数乘积与最大公约数的关系来计算。
C++复习卷1.docx
输入两个数,输出它们的最小公倍数通过函数来计算两个数的最小公倍数。**实现思路:**1. **定义求最小公倍数的函数**:可以利用最大公约数来计算。2. **读取输入**:读取两个整数。3.
java程序员面试题算法
【程序 6】:求最大公约数(GCD)和最小公倍数(LCM)通常使用欧几里得算法(辗转相除法)。GCD可通过不断用较大数除以较小数直到余数为0,最后的除数即为GCD。LCM可以通过两数相除以GCD得到。


