`

最大公约数最小公倍数

 
阅读更多
好吧,说实话是实在不喜欢算法,因为我数学一直很垃圾,150分的题,高中三年,150分的题,很少有上90的情况,99%是在70分上下晃悠,唉,很惭愧。这直接导致了我对数学的恐惧,毕业后走上了编程的道,发现还是有很多的算法,每次遇到算法我就傻,这里只是我的一些小记录,算是给自己的脑袋开开窍吧。
1、求最大公约数:
   假设有整数x,y,要求这两个数的最大公约数,怎么做?首先思路分析:先求出x和y中较小的数i,然后至i到0循环所有整数,第一个能被x和y整除的数即为最大公约数。
def gcd(x,y)
   i = x#假设x是两个数中最小的那个数,并赋值给i
   if x > y
      i = y#如果y比x小,那么将y赋值给i
   end
   while i > 0 #从i开始循环,每循环一次,i减小一个数,如果i大于0,那么一直循环里面的内容
      if x % i == 0 and y % i == 0
         return i #如果第一个数能够同时被x和y整除,那么这个数就是最大公约数
      else
         i -= 1#如果前一个数不能整除x和y,那么就减小一个数再整除x和y,以此循环
      end
   end
end


以上的思路已经整理清楚了,但是太复杂了,能不能短一点:
def gcd2(x, y)
   i = x
   i = y if x > y
   #i.downto(1)表示从i(两个数中最小的那个数)累减到0,每累减一次,拿到当前的数值,并传给后边的block,如果block中的条件满足,就返回当前的数值
   i.downto(1) {|j| return j if x%j==0 and y%j==0}
end


能不能再短一点:
def gcd3(x,y)
   #与上边的方法相比,downto函数是从两个数的和开始的,这是因为省略了判断两个数大小的判断
   (x+y).downto(1) {|j| return j if x%j==0 and y%j==0}
end

上面算法虽然能求出结果,但效率应该是最低的,其实有个算法被公认为求GCD的最快算法,学名叫“辗转相除法”
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公约数的:
1. 若 r 是 a ÷ b 的余数, 则gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公约数为 a
def gcd4(x,y)
   while y != 0#循环条件,如果y!=0就进入循环操作
      r = x % y#r作为x除以y的余数
      x = y #将y赋值给x
      y = r #将余数赋值给y,如果y,即上一次运算的余数不为0,则继续循环
   end
   return x
end


能不能即快又短
如果改成递归,可以简写成这样:
def gcd5(x,y)
   x,y = y,x if x<y#将大数赋值给x,小数赋值给y
   y==0 ? x : gcd5(x%y, y)#如果小数为0,则两个数的最大公约数为最大的数,否则,就用辗转相除法计算
end


上面的写法虽然只有两行但还是感觉有点多,能不能把x与y比较大小的也省去:
def gcd6(x, y)
   y == 0 ? x : gcd6(y, x%y) #若 r 是 a ÷ b 的余数, 则gcd(a,b) = gcd(b,r)
end


最小公倍数:
到现在为止,还没谈到最小公倍数LCM。一直不说,是因为有个神奇的公式。
GCD * LCM = x * y

所以可以通过gcd来算lcm:
def lcm(x,y)
   x * y / gcd(x,y)
end


好吧,如果我要求用一行代码写出来,求两个数的最小公倍数怎么写:
比如说我要求6和9的最小公倍数:
#因为任意两个数x和y,他们的最小公倍数的取值区间在1和x*y之间,那么我就从最小的一开始循环去试,如果这其中的第一个值满足了除以x 余数为0 并且 满足了除以y余数也为0,那么这个数就是最小的公倍数
1.upto(6*9){|j| return j if j%6 == 0 && j%9 == 0 }
分享到:
评论

相关推荐

    c++最大公约数最小公倍数.rar

    c++最大公约数最小公倍数.rarc++最大公约数最小公倍数.rarc++最大公约数最小公倍数.rarc++最大公约数最小公倍数.rarc++最大公约数最小公倍数.rarc++最大公约数最小公倍数.rar

    求最大公约数最小公倍数的3种算法的流程图

    本主题主要关注求最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)的三种常见算法,通过流程图的方式进行阐述。下面我们将详细探讨这五种算法及其流程。 1. 辗转相除法...

    最大公约数最小公倍数java

    在李胜杰的“最大公约数最小公倍数”项目中,他可能已经实现了这些功能,并可能包含了一些测试用例来验证算法的正确性。如果你想要进一步了解他的实现细节,可以查看压缩包内的源代码文件。通过分析和学习这些代码,...

    函数最大公约数最小公倍数.zip

    本压缩包文件"函数最大公约数最小公倍数.zip"可能包含了一些关于如何在程序中实现计算这两个值的代码示例或教程。 最大公约数(GCD)是指能够同时整除两个或多个非零整数的最大正整数。计算两个数的最大公约数有...

    c语言最大公约数最小公倍数

    本次解析的主题围绕“C语言最大公约数最小公倍数”展开,旨在深入探讨如何使用C语言来计算两个整数的最大公约数(Greatest Common Divisor,简称GCD)和最小公倍数(Least Common Multiple,简称LCM)。下面,我们将...

    最大公约数最小公倍数n-s盒图

    在计算机科学领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是两个基本的数学概念,它们在算法设计和数据分析中广泛应用。N-S盒图(NS-Box Diagram),又称诺依曼-...

    C++编程实现最大公约数最小公倍数

    c++实现求得两数最小公倍数最大公约数 简单易行特地分享一下

    求最大公约数最小公倍数

    根据给定文件的信息,本文将深入探讨如何计算两个整数的最大公约数(Greatest Common Divisor,简称GCD)和最小公倍数(Least Common Multiple,简称LCM)。这两个概念在数学和计算机科学中有着广泛的应用,特别是在...

    python求最大公约数最小公倍数

    最大公约数最小公倍数

    求最大公约数 最小公倍数

    ### 求最大公约数与最小公倍数 #### C语言实现 在C语言中,求解两个整数的最大公约数(GCD)和最小公倍数(LCM)是常见的编程任务。以下是对给定代码片段的分析及扩展解释。 #### 代码解读 ```c #include void ...

    最大公约数 最小公倍数 C++

    ### 最大公约数与最小公倍数的C++实现 #### 概述 在数学领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是两个非常重要的概念。最大公约数是指能够同时整除两个或多...

    输入两个正整数m和n,求其最大公约数和最小公倍数.rar

    最大公约数和最小倍数最大公约数和最小倍数最大公约数和最小倍数最大公约数和最小倍数最大公约数和最小倍数最大公约数和最小倍数最大公约数和最小倍数最大公约数和最小倍数最大公约数和最小倍数最大公约数和最小倍数...

    最大公约数最小公倍数.txt

    根据给定文件的信息,我们可以总结出以下相关的IT知识点: ### 1. 最大公约数(GCD)与最小公倍数(LCM)的计算 ...以上是关于最大公约数最小公倍数以及数组逆序操作的相关知识点及其C语言实现细节。

    如何用c语言求最大公约数和最小公倍数

    根据提供的文件信息,本文将详细解释如何使用C语言来实现最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)的计算。 ### 最大公约数(GCD) #### 概念 最大公约数是指两个...

    求最大公约数和最小公倍数

    "最大公约数和最小公倍数的计算方法" 最大公约数和最小公倍数是数学中两个重要的概念,它们在算法设计、数据分析和科学计算等领域都有着广泛的应用。本文将详细介绍两种常用的计算最大公约数和最小公倍数的方法,即...

    最大公约数最小公倍数.cpp

    最大公约数最小公倍数.cpp

    用C++求最大公约数最小公倍数的方法 .txt

    本文将深入探讨如何利用C++来寻找两个整数的最大公约数(Greatest Common Divisor,GCD)和最小公倍数(Least Common Multiple,LCM),这是基于给定的文件标题、描述、标签以及部分内容所提出的要求。 ### 一、...

Global site tag (gtag.js) - Google Analytics