首页 > 其他分享 >求 n 个数的最小公倍数(详解版)

求 n 个数的最小公倍数(详解版)

时间:2025-01-18 13:58:05浏览次数:3  
标签:10 公倍数 个数 最小 40 120 int 详解

你的好朋友小明最近在学习最小公倍数的知识,他妈妈给他出了100题,每一题都有n(2≤n≤20)个数,要小明求出这n个数的最小公倍数。小明现在想快点出去玩,于是想到会编程的你,能否设计一个程序,让他输入题目n个数就可以得到答案?快来帮帮小明吧!

输入格式

第一行一个整数 n (2≤n≤20)。

第二行 n 个整数。

输出格式

一个整数,表示最小公倍数,数据保证答案不超过int范围。

输出时每行末尾的多余空格,不影响答案正确性

输入/输出例子1

输入:

5

2 4 6 8 10

输出:

120

浅说:这道题如果是道数学的话比较容易,但代码实现的话不容易想到,下面对这道题的思路和样例进行了详细地解析,方便大家更好的理解~ 完整代码在最下面~

核心代码片段

for(int j = n - 1; j > 0; j--) {
    for(int i = a[j - 1]; i > 0; i--) {
        if(a[j] % i == 0 && a[j - 1] % i == 0) {
            a[j - 1] = a[j] * a[j - 1] / i;
            break;
        }
    }
}

代码的作用

这段代码的目的是计算数组中所有数的最小公倍数(LCM)。它的核心思想是:

  1. 从数组的末尾开始,依次计算相邻两个数的最小公倍数。

  2. 将计算得到的最小公倍数赋值给前一个数,然后继续向前计算。

  3. 最终,数组的第一个元素(a[0])就是所有数的最小公倍数。

代码的详细逻辑

for(int j = n - 1; j > 0; j--)
  • 从数组的最后一个元素开始,向前遍历到第二个元素(j 从 n-1 到 1)。
  • 每次循环处理 a[j] 和 a[j-1] 两个数。
for(int i = a[j - 1]; i > 0; i--)
  • 从 a[j-1] 开始递减,寻找 a[j] 和 a[j-1] 的最大公约数(GCD)。
  • i 是可能的公约数,从大到小遍历。
if(a[j] % i == 0 && a[j - 1] % i == 0)
  • 如果 i 能同时整除 a[j] 和 a[j-1],则 i 是它们的公约数。

  • 由于 i 是从大到小遍历的,第一个满足条件的 i 就是最大公约数(GCD)。

a[j - 1] = a[j] * a[j - 1] / i;
  • 利用公式 LCM(a,b) = GCD(a,b) / a×b​ 计算最小公倍数。

  • 将计算得到的最小公倍数赋值给 a[j-1]

break;
  • 找到最大公约数并计算最小公倍数后,跳出内层循环,继续处理下一对数。

举例说明

 假设输入数组为 a = [2, 4, 6, 8, 10],n = 5。

第一次外层循环(j = 4):
  • 当前数:a[j] = 10a[j-1] = 8

  • 内层循环从 i = 8 开始递减:

    • i = 8:检查 10 % 8 == 2,不满足。

    • i = 7:检查 10 % 7 == 3,不满足。

    • i = 6:检查 10 % 6 == 4,不满足。

    • i = 5:检查 10 % 5 == 0 且 8 % 5 == 3,不满足。

    • i = 4:检查 10 % 4 == 2,不满足。

    • i = 3:检查 10 % 3 == 1,不满足。

    • i = 2:检查 10 % 2 == 0 且 8 % 2 == 0,满足。

      • 计算最小公倍数:a[j-1] = (10 * 8) / 2 = 40

      • 更新数组:a = [2, 4, 6, 40, 10]

      • 跳出内层循环。

第二次外层循环(j = 3):
  • 当前数:a[j] = 40a[j-1] = 6

  • 内层循环从 i = 6 开始递减:

    • i = 6:检查 40 % 6 == 4,不满足。

    • i = 5:检查 40 % 5 == 0 且 6 % 5 == 1,不满足。

    • i = 4:检查 40 % 4 == 0 且 6 % 4 == 2,不满足。

    • i = 3:检查 40 % 3 == 1,不满足。

    • i = 2:检查 40 % 2 == 0 且 6 % 2 == 0,满足。

      • 计算最小公倍数:a[j-1] = (40 * 6) / 2 = 120

      • 更新数组:a = [2, 4, 120, 40, 10]

      • 跳出内层循环。

第三次外层循环(j = 2):
  • 当前数:a[j] = 120a[j-1] = 4

  • 内层循环从 i = 4 开始递减:

    • i = 4:检查 120 % 4 == 0 且 4 % 4 == 0,满足。

      • 计算最小公倍数:a[j-1] = (120 * 4) / 4 = 120

      • 更新数组:a = [2, 120, 120, 40, 10]

      • 跳出内层循环

第四次外层循环(j = 1):
  • 当前数:a[j] = 120a[j-1] = 2

  • 内层循环从 i = 2 开始递减:

    • i = 2:检查 120 % 2 == 0 且 2 % 2 == 0,满足。

      • 计算最小公倍数:a[j-1] = (120 * 2) / 2 = 120

      • 更新数组:a = [120, 120, 120, 40, 10]

      • 跳出内层循环。

最终结果
  • a[0] = 120,输出 120

完整代码

#include<bits/stdc++.h>
using namespace std;
int n,a[25];
int main(){
    cin>>n;
    for(int i = 0;i < n;i++){
        cin>>a[i];
    }
    sort(a,a + n);
    for(int i = n - 1;i > 0;i--){
        for(int j = a[i - 1];j > 0;j--){
            if(a[i] % j == 0 && a[i - 1] % j == 0){
                a[i - 1] = a[i] * a[i - 1] / j;   
                break;
            }
        }
    }
    cout<<a[0];
    return 0;
}

创造不易,如果对您有所帮助,请一键三连哦~你的支持是我继续创造的动力源泉~

标签:10,公倍数,个数,最小,40,120,int,详解
From: https://blog.csdn.net/2402_87298751/article/details/145168648

相关文章

  • 详解类与对象——对象的初始化与清理(3)
    关于对象的初始化和清理之前的内容请各位客官移步前两篇文章(^_^)六.初始化列表作用:C++提供了初始化列表语法,用来初始化属性语法:构造函数():属性1(值1),属性2(值2)...{}示例:classPerson{public: 传统方式初始化 //Person(inta,intb,intc){ // m_A=a;......
  • JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请
    目录JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)一、什么时候该使用Array.map(),与forEach()的区别是什么?1、什么时候该用Array.map()2、Array.map()与Array.forEach()的......
  • signal.h详解
    C库函数-signal()来自C库函数–signal()|菜鸟教程描述C库函数void(*signal(intsig,void(*func)(int)))(int)设置一个函数来处理信号,即带有sig参数的信号处理程序。signal函数是C标准库中的一个函数,用于设置信号处理程序。该函数定义在<signal.h>头文件......
  • 详解ppo算法
    详解ppo算法GPT-4oPoePPO(ProximalPolicyOptimization,近端策略优化)是深度强化学习中一种高效、稳定的策略优化算法,由OpenAI于2017年提出。PPO在策略梯度方法上进行了改进,结合了策略优化和信任域约束,使得训练更加稳定且易于实现。以下是对PPO算法的详细解读,包括背......
  • 深入理解 Linux systemd 单元类型及配置详解
    深入理解Linuxsystemd单元类型及配置详解在Linux系统中,systemd是一种强大的初始化系统和服务管理工具,它通过**单元(Unit)**来管理服务、文件系统、设备等。systemd支持多种单元类型,如服务单元(.service)、目标单元(.target)、挂载单元(.mount)、设备单元(.device)、计时单元(.t......
  • Java数组详解
    目录一、什么是数组二、声明和创建1、数组的声明2、数组的创建三、数组的初始化1.静态初始化(StaticInitialization)2.动态初始化(DynamicInitialization)3.默认初始化(DefaultInitialization)四、数组的基本使用1、访问元素2、数组长度3、遍历数组五、数组下......
  • Vue3中使用组合式API通过路由传值详解
    在Vue3中,使用组合式API来传递路由参数是一种常见的需求。VueRouter是Vue.js的官方路由管理工具,可以在不同的场景下通过多种方式传递和接收路由参数。下面将详细讲解几种常见的路由传值方式,并提供相应的代码示例。1.通过路由参数传值(动态路由参数)路由参数是一种最常......
  • Prometheus中Sample(样本)与Series(序列)的区别详解
    Prometheus中Sample(样本)与Series(序列)的区别详解 在Prometheus这一强大的开源监控和警报系统中,Sample(样本)与Series(序列)是两个核心概念,它们在数据模型和数据处理流程中扮演着至关重要的角色。本文将详细探讨这两个概念的定义、组成、作用以及它们之间的区别。一、Sample(样本)1.1......
  • linux内核态线程详解
    头文件:#include <linux/sched.h>     //wake_up_process()    #include <linux/kthread.h>   //kthread_create()、kthread_run()  #include <err.h>           //IS_ERR()、PTR_ERR()1.创建并启动一个内核线程:方式一:s......
  • Java 17 新特性详解与代码示例
    ......