【C++練習】18.C++求兩個整數的最小公倍數(LCM)

目錄

  • C++求兩個整數的最小公倍數(LCM)的方法
    • 方法一:利用最大公約數(GCD)計算
      • 代碼實現
    • 方法二:逐次增加法
      • 代碼實現
    • 方法三:質因數分解法
      • 代碼實現
    • 方法比較
    • 處理大數和特殊情況
    • 改進版GCD方法實現

C++求兩個整數的最小公倍數(LCM)的方法

最小公倍數(LCM)是指能夠同時被兩個數整除的最小的正整數。在C++中,有幾種常見的方法可以計算兩個整數的最小公倍數。

方法一:利用最大公約數(GCD)計算

這是最常用且高效的方法,基于數學公式:

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

代碼實現

#include <iostream>
#include <algorithm> // 用于std::gcd (C++17及以上)// 計算GCD的函數(如果編譯器不支持C++17的std::gcd)
int gcd(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;
}int lcm(int a, int b) {// 防止乘法溢出,先除以GCDreturn (a / std::gcd(a, b)) * b;// 或者使用自定義的gcd函數:// return (a / gcd(a, b)) * b;
}int main() {int num1, num2;std::cout << "輸入兩個整數: ";std::cin >> num1 >> num2;std::cout << "LCM(" << num1 << ", " << num2 << ") = " << lcm(num1, num2) << std::endl;return 0;
}

方法二:逐次增加法

這種方法通過逐個測試較大的數的倍數,直到找到能被兩個數都整除的數。

代碼實現

#include <iostream>int lcm(int a, int b) {int max = (a > b) ? a : b;while (true) {if (max % a == 0 && max % b == 0) {return max;}++max;}
}int main() {int num1, num2;std::cout << "輸入兩個整數: ";std::cin >> num1 >> num2;std::cout << "LCM(" << num1 << ", " << num2 << ") = " << lcm(num1, num2) << std::endl;return 0;
}

方法三:質因數分解法

將兩個數分解質因數,然后取每個質因數的最高冪次相乘。

代碼實現

#include <iostream>
#include <map>// 質因數分解函數
std::map<int, int> primeFactors(int n) {std::map<int, int> factors;if (n == 0) return factors;// 處理2的因數while (n % 2 == 0) {factors[2]++;n /= 2;}// 處理奇數因數for (int i = 3; i * i <= n; i += 2) {while (n % i == 0) {factors[i]++;n /= i;}}// 如果剩下的n是質數if (n > 2) {factors[n]++;}return factors;
}int lcm(int a, int b) {if (a == 0 || b == 0) return 0;auto factorsA = primeFactors(a);auto factorsB = primeFactors(b);// 合并兩個質因數映射,取每個因數的最大指數for (const auto& pair : factorsB) {if (factorsA[pair.first] < pair.second) {factorsA[pair.first] = pair.second;}}// 計算LCMint result = 1;for (const auto& pair : factorsA) {for (int i = 0; i < pair.second; ++i) {result *= pair.first;}}return result;
}int main() {int num1, num2;std::cout << "輸入兩個整數: ";std::cin >> num1 >> num2;std::cout << "LCM(" << num1 << ", " << num2 << ") = " << lcm(num1, num2) << std::endl;return 0;
}

方法比較

  1. GCD方法:最有效,時間復雜度為O(log(min(a, b))),推薦使用。
  2. 逐次增加法:簡單但效率低,時間復雜度為O(max(a, b)),僅適用于小數字。
  3. 質因數分解法:理論上有用,但實現復雜且效率不如GCD方法,適用于需要質因數分解的場景。

處理大數和特殊情況

在實際應用中,還需要考慮:

  • 處理負數(LCM總是正數)
  • 處理零(任何數與零的LCM是零)
  • 防止整數溢出

改進版GCD方法實現

#include <iostream>
#include <algorithm> // 用于std::gcd
#include <cstdlib>   // 用于absint lcm(int a, int b) {if (a == 0 || b == 0) return 0;// 取絕對值a = std::abs(a);b = std::abs(b);// 防止溢出,先除以GCD再相乘return (a / std::gcd(a, b)) * b;
}int main() {int num1, num2;std::cout << "輸入兩個整數: ";std::cin >> num1 >> num2;std::cout << "LCM(" << num1 << ", " << num2 << ") = " << lcm(num1, num2) << std::endl;return 0;
}

這種方法是最推薦的,因為它高效、簡潔且能處理各種邊界情況。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96806.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux網絡:應用層協議http

前言 雖然我們說&#xff0c;應用層協議是我們程序猿自己定的。但實際上,已經有大佬們定義了一些現成的,又非常好用的應用層協議,供我們直接參考使用.HTTP(超文本傳輸協議)就是其中之一。 我們之前已經學了UDP與TCP套接字的簡單使用&#xff0c;以及講解了進程間的各種關系&a…

ffmpeg推流測試

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言一、操作步驟1.測試12.測試2總結前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 環境信息&#xff1a; 攝像頭&#xff1a;usb攝像頭 &a…

Docker的使用及核心命令

文章目錄Docker基礎概念鏡像管理命令鏡像查看和搜索鏡像下載和刪除鏡像構建容器生命周期管理創建和啟動容器容器控制命令容器清理容器交互和調試進入容器文件操作日志和監控數據管理數據卷&#xff08;Volume&#xff09;綁定掛載網絡管理網絡基礎操作端口映射Dockerfile和Dock…

考研408計算機網絡第36題真題解析(2021-2023)

&#xff08;2023.36&#xff09;在使用 CSMA/CD 協議的環境中&#xff0c;使用截斷二進制指數退避算法&#xff0c;來選擇重傳時機&#xff0c;算法 有如下規定&#xff1a; &#xff08;1&#xff09;基本的退避時間為爭用期 2τ&#xff0c;假設某網絡具體的爭用期為 51.2us…

Asio C++ Library是用來做什么的

hriskohlhoff/asio 是由 Chris Kohlhoff 主導維護的開源 C 庫&#xff0c;專注于提供高效、跨平臺的異步 I/O 支持&#xff0c;廣泛應用于網絡編程、并發控制和高性能系統開發。 &#x1f4d8; 項目概述 項目名稱&#xff1a;Asio C Library 下載地址&#xff1a;https://down…

ac791的按鍵ad_channel

每次ad_channel這個參數都要給我一定的迷惑性&#xff0c;讓我以為這是通道的數量

機器人巡檢與巡邏的區別進行詳細講解和對比

機器人巡檢與巡邏的區別進行詳細講解和對比 盡管這兩個詞經常被混用&#xff0c;但在技術和應用層面上&#xff0c;它們有著本質的區別。核心區別在于&#xff1a;巡檢是“深度體檢”&#xff0c;而巡邏是“治安巡查”。 以下將從多個維度進行詳細講解和對比。 一、核心概念與目…

先進電機拓撲及控制算法介紹(3)——以“數據”驅動電機實現真正的無模型

1. 背景介紹 之前已經介紹過“無模型預測控制&#xff08;Model-Free Predictive Control/MFPC&#xff09;”中的“無模型預測電流控制&#xff08;Model-Free Predictive Current Control/MFPCC&#xff09;”&#xff0c;可參考下面知乎。 https://zhuanlan.zhihu.com/p/6…

C primer plus (第六版)第十一章 編程練習第5,6題

題目&#xff1a;5&#xff0e;設計并測試?個函數&#xff0c;搜索第1個函數形參指定的字符串&#xff0c;在其中查找第2個函數形參指定的字符?次出現的位置。如果成功&#xff0c;該函數返指向該字符的指針&#xff0c;如果在字符串中未找到指定字符&#xff0c;則返回空指針…

Altium Designer(AD)PCB絲印批量修改

目錄 1 Altium Designer(AD)PCB絲印的字體批量修改 1.1選中所有絲印 1.1.1選中一個絲印:鼠標左鍵點擊 1.1.2查找相似對象:鼠標右鍵或快捷鍵N 1.1.3如下圖所示絲印被全部選中 1.2絲印字體信息修改 1.2.1打開屬性面板——>位置/屬性/字體修改 1.2.2絲印字體修改 1.2.…

AI+華為HarmonyOS開發工具DevEco Studio詳細安裝指南

作者&#xff1a;長江支流 日期&#xff1a;2025-09-13 第一部分&#xff1a;AI工具使用 一、如何使用DeepSeek幫助自己的工作&#xff1f; &#xff08;一&#xff09;提示詞 為了與時俱進&#xff0c;充分利用最新技術、提高效率&#xff0c;采用AI生成部分材料&#xf…

【Ambari監控】— API請求邏輯梳理

附錄&#xff1a;完整內容和源代碼下載請參照 https://doc.janettr.com/ 一、前序章節回憶 我們在前面章節拆解了 Collector 的啟動過程&#xff0c;并定位了控制器 TimelineWebServices。 本節聚焦 Collector 對外暴露的 REST 服務&#xff0c;搭建「接口全景圖」。 二、接口…

論文閱讀 2025-9-13 論文閱讀隨心記

隨便記錄一下最近閱讀的幾篇論文 1. Does DINOv3 Set a New Medical Vision Standard? 第一章 動機 (Motivation) 自然圖像領域的成功范式&#xff1a;大型語言模型&#xff08;LLMs&#xff09;和視覺基礎模型&#xff08;如 DINO 系列&#xff09;證明&#xff0c;通過自監督…

Avalonia 基礎導航實現:從頁面切換到響應式交互全指南

在 Avalonia 開發中&#xff0c;導航功能是構建多頁面應用的核心需求。Avalonia 無需依賴第三方庫&#xff0c;僅通過內置控件與 MVVM 模式即可實現靈活的頁面切換。本文將以 “基礎導航” 為核心&#xff0c;從 ViewModel 與 View 設計、導航邏輯實現&#xff0c;到樣式美化與…

UniApp 分包異步化配置及組件引用解決方案

具體參考微信小程序文檔基礎能力 / 分包加載 / 分包異步化 一、分包頁面組件配置 在 UniApp 的pages.json中&#xff0c;為分包頁面&#xff08;或主包如 tabbar 頁面&#xff09;配置異步組件時&#xff0c;需同時設置usingComponents和componentPlaceholder&#xff1a; {&…

系統核心解析:深入操作系統內部機制——進程管理與控制指南(一)【進程/PCB】

???~~~~~~歡迎光臨知星小度博客空間~~~~~~??? ???零星地變得優秀~也能拼湊出星河~??? ???我們一起努力成為更好的自己~??? ???如果這一篇博客對你有幫助~別忘了點贊分享哦~??? ???如果有什么問題可以評論區留言或者私信我哦~??? ??????個人…

微論-神經網絡特征空間的動態聚集,對抗災難性遺忘的新范式

這是一個非常有趣且富有想象力的理論構想。受陀螺儀啟發&#xff0c;我將陀螺儀的“定軸性”與“進動性”原理引入神經網絡的特征空間&#xff0c;探討一種對抗災難性遺忘的新范式。---### **基于陀螺儀原理的神經網絡記憶鞏固理論探討**#### **引言&#xff1a;記憶的流失與穩…

鴻蒙審核問題——折疊屏展開態切換時,輸入框內容丟失

文章目錄背景解決歷程1、無意中發現了眉目2、確定問題原因3、解決辦法4、官方文檔5、總結背景 奇葩的事情年年有啊&#xff0c;今年特別多。這不今天又遇到了一個奇葩的問題。鴻蒙NextAPP上架AppGallery市場&#xff0c;審核拒了&#xff0c;說是折疊屏手機展開態切換時&#…

前后端分離架構中,Node.js的底層實現原理與線程池饑餓問題解析

在VueJava/.NET的前后端分離架構中&#xff0c;Node.js的底層實現原理與線程池饑餓問題解析 一、架構概述&#xff1a;Node.js的定位與角色 在現代Web開發中&#xff0c;Vue.js作為前端框架與Java/.NET后端結合的架構非常流行。在這種架構中&#xff0c;Node.js通常扮演著兩個關…

Django ModelForm:快速構建數據庫表單

Django 中的 forms.ModelForm —— 它是 Django 表單系統和 ORM 的一個“橋梁”&#xff0c;能幫助你快速基于 數據庫模型&#xff08;Model&#xff09; 自動生成表單&#xff0c;極大減少重復代碼。1. 什么是 ModelForm 普通 Form (forms.Form)&#xff1a;完全手寫字段&…