当前位置: 首页 > news >正文

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 的关系
  • 欧几里得算法的强大
  • 数学优化如何替代暴力
http://www.jsqmd.com/news/780577/

相关文章:

  • 如何理解 ES2019 后 sort 方法在各浏览器中的稳定性
  • 使用Taotoken CLI工具一键配置多开发环境下的AI助手接入
  • Dify应用——AI美妆护肤智能客服
  • 1 虚拟文件系统
  • Instagit:为AI编程助手注入源码洞察力,告别API幻觉与过时文档
  • 本地靠谱的定制软件开发公司供应商
  • 5G波形技术革新:块滤波OFDM与同频全双工实战验证
  • ConvNeXt优化扩散模型:高效图像生成新方案
  • 破解研发数字化转型中的协同效率瓶颈
  • LLM智能体记忆优化:RL驱动的mem-agent架构解析
  • OpenClaw开源项目:AI驱动机器人灵巧手抓取技术全解析
  • WebMCP:基于MCP协议的大模型与外部工具连接实战指南
  • 语音驱动AI智能体:从Whisper到工具调用的全链路实践
  • 语音技能开发框架解析:从事件驱动到插件化实现
  • 基于RAG与智能体的长链推理知识库问答系统架构与实践
  • Arm Neoverse V3AE核心架构解析与配置优化
  • AI Agent安全工程2026:越狱攻击、提示词注入与防御体系完整指南
  • AI智能体设计智库:从结构化数据到可编程设计技能
  • 基于Hermes协议与MQTT构建开源语音技能:从架构到部署实践
  • 经过1天的时间基本得出结论------看到的2个框其实是不同时间的同一个框
  • 构建可执行技能手册:开发者知识管理的GitHub实践
  • Linux sh文件报错: cannot execute: required file not found
  • 基于MCP协议实现AFFiNE知识库与AI助手深度集成:部署与实战指南
  • Linux动画光标主题制作:从Windows光标到XCursor的自动化转换
  • dsPIC30F实现AC感应电机控制的关键技术与实践
  • 2026年4月仓储货架供应商口碑推荐,家庭库房货架/公司库房货架/智能仓储货架/高层货架,仓储货架源头厂家口碑推荐 - 品牌推荐师
  • 别再用MNIST了!用Sklearn的load_digits数据集5分钟搞定你的第一个逻辑回归分类器
  • agent使用初体验
  • 神经语音解码技术BrainWhisperer:ASR与BCI的融合创新
  • 半导体节能技术:从工艺到系统架构的全面优化