GCD&LCM

Description 

Consider 2 integers a,b,and gcd(a,b)=n,lcm(a,b)=m.Now give you 2 integers n,m,there may exist multiple (a,b) meet requirements,Please tell me the pair which has the minimum sum.

Input 

The input consists of multiple test cases. Each contains 2 integers n,m.(0 < n ,m<=10^12)。

Output 

For each case,output 2 integer x,y.(x<=y).The pair which has the minimum sum.

3 60

12 15

 

题目链接

 

与这题的做法相同,甚至还是简化版

 

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef long long ll;
const ll INF=1e13;
ll N, M, p, q;      //gcd==N; lcm==M; gcd(pN, qN)==N, lcm(pN, qN)==M
ll little, large, ans_little, ans_large;
ll gcd(ll a, ll b)
{
    return b==0?a:gcd(b, a%b);
}
int main()
{
    while(scanf("%lld%lld", &N, &M)!=EOF)
    {
        if(M%N) continue;
        little=large=ans_large=ans_little=INF;
        M/=N;
        for(ll i=1; i*i<=M; i++)
        {
            if(M%i==0 && gcd(i, M/i)==1)
            {
                ans_little=i;
                ans_large=M/i;
            }
        }
        printf("%lld %lld\n", ans_little*N, ans_large*N);
    }
    return 0;
}

 

<think>好的,我现在需要帮助用户了解如何用编程实现求解最小公倍数(LCM)和最大公约数(GCD)。首先,我得回忆一下这两个概念的定义以及常见的算法。 用户提供的引用中提到了GCD和LCM的基本定义。GCD是能同时整除两个数的最大正整数,而LCM是能被这两个数整除的最小正整数。根据引用[1],传统的算法是欧几里得算法,通过递归或迭代计算余数来找到GCD。然后,LCM可以通过两个数的乘积除以GCD得到,但引用[3]提到用户可能需要自己设计算法,不能直接用乘积除以GCD的方法,这可能是一个需要注意的点。 接下来,我需要考虑如何将这些数学概念转化为编程代码。对于GCD,最有效的方法确实是欧几里得算法,这已经在引用[2]中的C++代码示例中体现。对于多个数的GCD,可以采用逐个计算当前GCD和下一个元素的方法,如引用[2]中的数组处理方式。 对于LCM,如果用户不能使用乘积除以GCD的方式,可能需要另一种方法,比如找出两个数中较大的那个,然后逐步增加直到找到能被两个数整除的最小数值。这种方法虽然效率不高,但对于小数字是可行的。但需要确认用户的具体要求,引用[3]提到必须自己设计算法,所以可能需要实现这种暴力方法。 然后,我需要考虑如何用不同的编程语言来实现这些算法。用户提供的示例中有Python、C++和C语言,所以可能需要展示多种语言的实现,以满足不同用户的需求。比如,Python中使用递归实现GCD,而C++中使用循环或递归,并处理多个数的情况。 另外,用户的问题中提到了生成相关问题,我需要确保在回答的最后部分列出相关问题,帮助用户进一步学习。例如,可能的问题包括算法的时间复杂度、优化方法、处理多个数的情况等。 现在需要检查是否有遗漏的细节。比如,处理多个数的LCM时,是否可以采用类似GCD的方法,逐个计算当前LCM和下一个数?是的,因为LCM(a, b, c) = LCM(LCM(a, b), c)。所以在代码示例中需要展示如何处理数组中的多个元素。 此外,引用[3]中特别指出不能使用乘积除以GCD来计算LCM,所以必须提供另一种方法,比如暴力查找。虽然这种方法在效率上不如数学公式,但对于教学目的来说是可以接受的,特别是当用户需要理解底层原理时。 最后,需要确保代码示例的正确性,比如在Python中使用递归的正确终止条件,或者在暴力查找LCM时正确递增并检查条件。同时,注释和代码结构要清晰,方便用户理解。 总结步骤: 1. 解释GCD和LCM的概念。 2. 介绍欧几里得算法实现GCD。 3. 展示如何用编程语言(如Python、C++)实现GCD。 4. 讨论处理多个数GCD的方法。 5. 介绍LCM的计算方法,包括数学公式和暴力查找。 6. 提供不同语言的LCM实现,特别是不能使用GCD的情况。 7. 处理多个数LCM的方法。 8. 生成相关问题以供进一步学习。</think>### 最大公约数(GCD)与最小公倍数(LCM)的编程实现 #### 一、核心概念 1. **最大公约数(GCD)**:能同时整除两个数的最大正整数,例如$gcd(12,18)=6$ 2. **最小公倍数(LCM)**:能同时被两个数整除的最小正整数,例如$lcm(4,6)=12$ 两者满足关系: $$a \times b = gcd(a,b) \times lcm(a,b)$$ 但计算时通常先求GCD,再通过公式求LCM[^1] #### 二、GCD实现方法 **欧几里得算法**(辗转相除法): $$gcd(a,b) = gcd(b, a\%b)$$ 直到余数为0时,当前除数即为GCD **Python实现**: ```python def gcd(a, b): while b != 0: a, b = b, a % b return a ``` **多数字GCD计算**: 逐个计算当前结果与下一个数的GCD ```python def multi_gcd(numbers): current_gcd = numbers[0] for num in numbers[1:]: current_gcd = gcd(current_gcd, num) return current_gcd ``` #### 三、LCM实现方法 **标准公式法**: $$lcm(a,b) = \frac{|a \times b|}{gcd(a,b)}$$ **Python实现**: ```python def lcm(a, b): return abs(a * b) // gcd(a, b) if a and b else 0 ``` **暴力查找法**(不依赖GCD): ```python def lcm_brute(a, b): max_num = max(a, b) while True: if max_num % a == 0 and max_num % b == 0: return max_num max_num += 1 ``` **多数字LCM计算**: ```python def multi_lcm(numbers): current_lcm = numbers[0] for num in numbers[1:]: current_lcm = lcm(current_lcm, num) return current_lcm ``` #### 四、应用示例 输入数组`[12, 18, 24]`时: - GCD计算过程:`gcd(12,18)=6` → `gcd(6,24)=6` - LCM计算过程:`lcm(12,18)=36` → `lcm(36,24)=72` #### 五、算法复杂度 - **时间复杂度**:欧几里得算法为$O(\log(\min(a,b)))$,远优于暴力法的$O(n)$ - **空间复杂度**:均为$O(1)$(迭代实现)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wuliwuliii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值