news 2026/5/9 3:43:32

go语言:实现求 1 到 20 的所有数整除的最小正数算法(附带源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go语言:实现求 1 到 20 的所有数整除的最小正数算法(附带源码)

一、项目背景详细介绍

在数学与算法领域,有一类经典问题:

最小公倍数(Least Common Multiple, LCM)问题

其中最著名的经典题之一是:

找到能够被 1 到 20 所有整数整除的最小正数

这也是:

👉 Project Euler 第5题

该问题看似简单,但背后涉及:

  • 最大公约数(GCD)
  • 最小公倍数(LCM)
  • 欧几里得算法
  • 数论优化
  • 素因数分解

是学习数学算法的经典案例。


二、题目详细说明


2.1 题目定义

寻找最小正整数:

x

满足:

x % 1 == 0 x % 2 == 0 x % 3 == 0 ... x % 20 == 0

即:

👉 能被 1~20 所有整数整除。


2.2 示例(小规模)

例如:

1~10

最小满足值:

2520

因为:

2520 可以被: 1,2,3,4,5,6,7,8,9,10 全部整除

2.3 最终答案(1~20)

结果:

232792560

三、项目需求详细介绍


3.1 功能需求

实现函数:

func SmallestMultiple(n int) int

功能:

  • 输入 n
  • 返回能被 1~n 全部整除的最小正整数

3.2 输入要求

n >= 1

3.3 输出要求

返回:

LCM(1,2,3...n)

3.4 扩展需求

支持:

  • 超大范围
  • 大整数
  • 多种算法实现
  • 高性能优化

四、相关技术详细介绍


4.1 什么是最小公倍数(LCM)?

定义:

两个数共同倍数中的最小值

例如:

LCM(4,6)=12

4.2 什么是最大公约数(GCD)?

定义:

两个数共同约数中的最大值

例如:

GCD(12,18)=6

4.3 LCM 与 GCD 的关系(核心)

最重要公式:

LCM(a,b) = a*b / GCD(a,b)

这是本题核心。


4.4 欧几里得算法(辗转相除法)

用于:

👉 快速求 GCD

公式:

GCD(a,b) = GCD(b, a%b)

示例

GCD(48,18) 48%18=12 18%12=6 12%6=0 结果=6

五、实现思路详细介绍


5.1 方法一:暴力法(不推荐)

思路:

从1开始:

不断检查: 是否能被1~20全部整除

问题:

极其慢

5.2 方法二:逐步LCM(推荐)

核心思想:

LCM(1,2,3...n) = LCM(LCM(1,2),3...)

5.3 方法三:素因数分解优化

数学方法:

  • 找每个素数最高幂

例如:

1~20: 2^4 3^2 5 7 11 13 17 19

相乘即可。


六、完整实现代码

// =========================================== // file: main.go // 求1到20所有数整除的最小正数 // =========================================== package main import ( "fmt" "math" ) ////////////////////////////////////////////////////////////// // 欧几里得算法:求最大公约数 GCD ////////////////////////////////////////////////////////////// func GCD(a, b int) int { for b != 0 { a, b = b, a%b } return a } ////////////////////////////////////////////////////////////// // 求最小公倍数 LCM ////////////////////////////////////////////////////////////// func LCM(a, b int) int { return a * b / GCD(a, b) } ////////////////////////////////////////////////////////////// // 方法一:逐步LCM(推荐) ////////////////////////////////////////////////////////////// func SmallestMultiple(n int) int { result := 1 for i := 2; i <= n; i++ { result = LCM(result, i) } return result } ////////////////////////////////////////////////////////////// // 方法二:暴力法(演示) ////////////////////////////////////////////////////////////// func SmallestMultipleBrute(n int) int { number := n for { divisible := true for i := 1; i <= n; i++ { if number%i != 0 { divisible = false break } } if divisible { return number } number++ } } ////////////////////////////////////////////////////////////// // 判断素数 ////////////////////////////////////////////////////////////// func IsPrime(n int) bool { if n < 2 { return false } for i := 2; i <= int(math.Sqrt(float64(n))); i++ { if n%i == 0 { return false } } return true } ////////////////////////////////////////////////////////////// // 方法三:素因数优化法 ////////////////////////////////////////////////////////////// func SmallestMultiplePrime(n int) int { result := 1 for p := 2; p <= n; p++ { if IsPrime(p) { power := p for power*p <= n { power *= p } result *= power } } return result } ////////////////////////////////////////////////////////////// // 主函数 ////////////////////////////////////////////////////////////// func main() { n := 20 fmt.Println("LCM方法:") fmt.Println( SmallestMultiple(n), ) fmt.Println("素因数优化:") fmt.Println( SmallestMultiplePrime(n), ) // 暴力法仅适合小范围 fmt.Println("暴力法(1~10):") fmt.Println( SmallestMultipleBrute(10), ) }

七、代码详细解读


7.1 GCD函数

作用:

👉 使用欧几里得算法求最大公约数

核心:

a, b = b, a%b

7.2 LCM函数

作用:

  • 求最小公倍数

公式:

LCM = a*b/GCD

7.3 SmallestMultiple

作用:

👉 逐步累积LCM

过程:

LCM(1,2) → LCM(result,3) → LCM(result,4) ...

7.4 SmallestMultiplePrime

作用:

👉 数学优化版本

核心:

取每个素数的最高幂

7.5 SmallestMultipleBrute

作用:

  • 演示暴力法

缺点:

非常慢

八、项目详细总结


8.1 核心思想

本问题本质:

👉LCM连续累积问题


8.2 技术收获

你会掌握:

  • GCD
  • LCM
  • 欧几里得算法
  • 数论优化

8.3 性能分析

方法时间复杂度
暴力法极高
LCM法O(n log n)
素因数法O(n√n)

8.4 最优方案

推荐:

LCM连续法

工程最常用。


九、项目常见问题及解答


9.1 为什么 LCM 可以连续计算?

因为:

LCM满足结合律

9.2 为什么暴力法慢?

因为:

👉 检查次数巨大。


9.3 为什么欧几里得算法快?

因为:

每次都会大幅缩小问题规模

9.4 为什么素因数法有效?

因为:

👉 LCM 本质是:

所有素因数最高幂组合

十、扩展方向与性能优化


10.1 大整数支持

使用:

math/big

支持超大范围。


10.2 并行GCD

使用 goroutine。


10.3 分布式数论计算

适合科研级。


10.4 数学扩展

相关问题:

  • 最大公约数合集
  • 中国剩余定理
  • 欧拉函数

10.5 工程应用

  • 密码学
  • 分布式哈希
  • 时钟同步系统

结语

“1~20 最小整除数问题”是:

👉数论算法中的经典入门题

它帮助你真正理解:

  • GCD 与 LCM 的关系
  • 欧几里得算法的强大
  • 数学优化如何替代暴力
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 3:42:30

开源AI对话聚合平台LibreChat:统一管理多模型,部署与实战指南

1. 项目概述&#xff1a;一个真正开源的AI对话聚合平台如果你和我一样&#xff0c;在过去一年里被各种AI聊天机器人搞得眼花缭乱&#xff0c;一会儿用这个查资料&#xff0c;一会儿用那个写代码&#xff0c;账号密码记了一堆&#xff0c;界面换来换去效率极低&#xff0c;那你一…

作者头像 李华
网站建设 2026/5/9 3:42:29

从零开始写Qwen3(五-其四)FlashAttention 差异汇编分析

从零开始写Qwen3目录 概述 经过前文的提速&#xff0c;耗时已经从官方的214%降低到112%&#xff0c;本文将从汇编角度猜测一下差距的原因 概述 使用上一节的输入参数&#xff0c;设置为BMBN64&#xff0c;和torch相同&#xff0c;分析汇编指令 torch的指令统计如下 triton…

作者头像 李华
网站建设 2026/5/9 3:42:29

Cursor插件no-secrets:编码时实时检测API密钥泄露的AI助手

1. 项目概述&#xff1a;为什么我们需要一个“代码守门人”&#xff1f;在代码仓库里意外提交一个API密钥或者数据库连接字符串&#xff0c;这事儿听起来像是新手才会犯的错误&#xff0c;但说实话&#xff0c;我见过太多经验丰富的开发者&#xff0c;包括我自己&#xff0c;都…

作者头像 李华
网站建设 2026/5/9 3:41:31

构建个人技能知识库:模块化设计与实践指南

1. 项目概述&#xff1a;一个技能聚合与管理的开源工具箱 最近在GitHub上闲逛时&#xff0c;发现了一个名为“mega-mind-skills”的项目&#xff0c;作者是k1lgor。这个标题本身就挺有意思的&#xff0c;直译过来是“超级大脑技能”。点进去一看&#xff0c;发现它并非一个单一…

作者头像 李华
网站建设 2026/5/9 3:41:28

破解研发数字化转型中的协同效率瓶颈

在制造业研发数字化转型的浪潮中&#xff0c;产品生命周期管理系统的选型&#xff0c;已成为企业突破研发协同效率瓶颈、迈向协同创新的关键决策。这一选择不仅关乎一套软件工具的引入&#xff0c;更是一场涉及流程再造、数据治理与组织协同的战略规划。本文将探讨如何规划一条…

作者头像 李华
网站建设 2026/5/9 3:33:43

多模态AI框架MMClaw:从编码融合到实战部署全解析

1. 项目概述&#xff1a;一个面向多模态内容理解的“机械爪” 最近在折腾一些多模态项目时&#xff0c;发现一个挺有意思的仓库&#xff0c;叫 leadersboat/MMClaw 。光看名字&#xff0c; MM 大概率指的是 Multimodal&#xff08;多模态&#xff09; &#xff0c;而 Cl…

作者头像 李华