递归法求最大公约数和最小公倍数的实现代码

时间:2023-10-07 02:11:34 


       数学原理:

       设有两个数num1和num2,假设num1比较大。令余数r = num1 % num2。
       当r == 0时,即num1可以被num2整除,显然num2就是这两个数的最大公约数。
       当r != 0时,令num1 = num2(除数变被除数),num2 = r(余数变除数),再做 r = num1 % num2。递归,直到r == 0。
       以上数学原理可以用具体的两个数做一下分析,这样容易理解。

代码实现(求最大公约数):


#include <iostream>
using namespace std;

int gcd(int a, int b);//声明最大公约数函数

int main()
{
    int num1 = 1;
    int num2 = 1;   
    cin >> num1 >> num2;
    while(num1 == 0 || num2 == 0)//判断是否有0值输入,若有则重新输入
    {
        cout << "input error !" << endl;
        cin >> num1 >> num2;
    }
    cout << "The gcd of " << num1 << " and " << num2 << " is: " << gcd(num1, num2) << endl;//调用最大公约数函数
    return 0;
}

int gcd(int a, int b)//函数定义
{
    int max = a > b ? a : b;
    int min = a < b ? a : b;
    a = max;
    b = min;
    int r = a % b;
    if(0 == r)//若a能被b整除,则b就是最大公约数。
        return b;
    else
        return gcd(b, r);//递归   
}

最小公倍数的求法建立在求最大公约数的方法之上。因为最小公倍数等于两个数的积除以最大公约数。

代码实现(求最小公倍数):


#include <iostream>
using namespace std;

int gcd(int a, int b);//声明最大公约数函数

int main()
{
    int num1 = 1;
    int num2 = 1;   
    int lcm = 1;
    cin >> num1 >> num2;
    while(num1 == 0 || num2 == 0)//判断是否有0值输入,若有则重新输入
    {
        cout << "input error !" << endl;
        cin >> num1 >> num2;
    }
    lcm = num1 / gcd(num1, num2) * num2;//先除后乘可以在一定程度上防止大数
    cout << "The lcm of " << num1 << " and " << num2 << " is: " << lcm << endl;
    return 0;
}

int gcd(int a, int b)//函数定义
{
    int max = a > b ? a : b;
    int min = a < b ? a : b;
    a = max;
    b = min;
    int r = a % b;
    if(0 == r)//若a能被b整除,则b就是最大公约数。
        return b;
    else
        return gcd(b, r);//递归   
}

以上是仅仅限与求两个书的最大公约数和最小公倍数,当数字有很多时,该法是否依然适用,还有待考证。

标签:递归法,最大公约数,最小公倍数
0
投稿

猜你喜欢

  • 浅谈java中静态方法的重写问题详解

    2022-12-24 10:13:04
  • Android 如何使用短信链接打开APP

    2022-01-09 02:45:25
  • Android线程的优先级设置方法技巧

    2022-04-27 13:14:02
  • 详解SpringBoot迭代发布JAR瘦身配置

    2021-11-14 19:10:48
  • 解决RedisTemplate调用increment报错问题

    2023-11-20 06:35:05
  • spring-cloud-gateway动态路由的实现方法

    2021-07-25 15:24:37
  • Android带进度条的文件上传示例(使用AsyncTask异步任务)

    2023-06-24 09:43:11
  • Android使用Websocket实现聊天室

    2023-07-07 13:01:59
  • Android查看文件夹大小以及删除文件夹的工具类

    2023-06-12 05:51:10
  • Java实现Dijkstra输出最短路径的实例

    2023-09-01 17:44:02
  • Java链表中元素删除的实现方法详解【只删除一个元素情况】

    2023-01-16 11:49:41
  • Springboot+WebSocket实现一对一聊天和公告的示例代码

    2022-06-16 11:32:33
  • SpringBoot带你实现一个点餐小程序

    2022-04-01 23:38:08
  • c# 解决IIS写Excel的权限问题

    2021-08-21 03:23:34
  • C#子类对基类方法的继承、重写与隐藏详解

    2023-01-31 04:48:46
  • java线程池使用后到底要关闭吗

    2022-03-17 04:28:43
  • Android编程使用WebView实现与Javascript交互的方法【相互调用参数、传值】

    2023-12-04 01:39:07
  • Java 如何实现时间控制

    2023-02-20 06:19:23
  • C#队列Queue用法实例分析

    2023-02-27 22:35:14
  • java对list<Object>进行手动分页实现

    2023-01-13 13:41:01
  • asp之家 软件编程 m.aspxhome.com