大大毛 的筆記

            DDM's Note

          哪怕沒有辦法一定有說法,
          就算沒有鴿子一定有烏鴉,
          固執無罪 夢想有價,
          讓他們驚訝.

          posts - 14, comments - 23, trackbacks - 0, articles - 58
             :: 首頁 ::  :: 聯系 ::  :: 管理

          求最大公約數及最小公倍數

          Posted on 2007-04-02 22:55 大大毛 閱讀(410) 評論(0)  編輯  收藏 所屬分類: 常用算法


          ??????最近用到最小公倍數、最大公約數是因為需要對用戶 Key In 的數據(分數形式)進行檢驗,檢驗的規則是同組的數據之和 =? 1,這樣就需要求分母的最小公倍數。

          ??????在網上搜索了一下,主要介紹的算法有兩種:

          ??????1. 歐幾里德算法
          ?????????又叫輾轉相除法,是最常用的算法,以前學到的就是這個了。它僅在對大素數的模運算時會遇到麻煩。

          ' Euclid算法(VB)
          Public ? Function ?fEuclid(lngNum1? As ? Long ,?lngNum2? As ? Long )? As ? Long
          ????
          Dim ?lngA? As ? Long ,lngB? As ? Long ,lngC? As ? Long
          ????
          If ?lngNum1? = ? 0 ? Or ?lngNum2? = ? 0 ? Then
          ????????
          If ?lngNum1? = ? 0 ? Then
          ????????????fEuclid?
          = ?lngNum2
          ????????
          Else
          ????????????fEuclid?
          = ?lngNum1
          ????????
          End ? If
          ????????
          Exit ? Function
          ????
          End ? If
          ????
          If ?lngNum1? >= ?lngNum2? Then
          ????????lngA?
          = ?lngNum1:lngB? = ?lngNum2
          ????
          Else
          ????????lngA?
          = ?lngNum2:lngB? = ?lngNum1
          ????
          End ? If
          ????lngC?
          = ?lngA? Mod ?lngB
          ????
          Do ? While ?lngC? > ? 0
          ????????lngA?
          = ?lngB:lngB? = ?lngC
          ????????lngC?
          = ?lngA? Mod ?lngB
          ????
          Loop
          ????
          ????fEuclid?
          = ?lngB

          End?Function

          ??????2. Stein算法
          ?????????a.??? 如果A=0,B是最大公約數;如果B=0,A是最大公約數
          ?????????b.?? An = A,Bn = B,Cn = 1 (當n=1時)
          ?????????c1. 如果An和Bn都是偶數,則An+1 = An /2,Bn+1 = Bn /2,Cn+1 = Cn *2
          ?????????c2. 如果An是偶數,Bn不是偶數,則An+1 = An /2,Bn+1 = Bn ,Cn+1 = Cn
          ?????????c3. 如果Bn是偶數,An不是偶數,則Bn+1 = Bn /2,An+1 = An ,Cn+1 = Cn
          ?????????c4.?如果An和Bn都不是偶數,則An+1 = |An - Bn|,Bn+1 =min(An,Bn),Cn+1 = Cn
          ?????????d.??? n++
          ?????????Stein算法最大的好處就是它只使用到了減法以及移位操作(與2運算),能夠避免歐幾里德算法運用到大數上所面臨的問題。

          ' Stein算法(VB)
          Public ? Function ?fStein(lngNum1? As ? Long ,?lngNum2? As ? Long )? As ? Long
          ????
          Dim ?lngResult? As ? Long ,?lngA? As ? Long ,?lngB? As ? Long ,?lngC? As ? Long
          ????lngA?
          = ?lngNum1:?lngB? = ?lngNum2:?lngC? = ? 1
          ????
          ????
          Do ? While ?lngA? <> ? 0 ? And ?lngB? <> ? 0
          ????????
          If ?lngA? Mod ? 2 ? = ? 0 ? And ?lngB? Mod ? 2 ? = ? 0 ? Then
          ????????????lngA?
          = ?lngA? / ? 2 :?lngB? = ?lngB? / ? 2 :?lngC? = ?lngC? * ? 2
          ????????
          Else
          ????????????
          If ?lngA? Mod ? 2 ? <> ? 0 ? And ?lngB? Mod ? 2 ? <> ? 0 ? Then
          ????????????????
          If ?lngA? > ?lngB? Then
          ????????????????????
          ' lngB?=?lngB
          ????????????????????lngA? = ?lngA? - ?lngB
          ????????????????
          Else
          ????????????????????lngB?
          = ?lngA
          ????????????????????lngA?
          = ?lngB? - ?lngA
          ????????????????
          End ? If
          ????????????
          Else
          ????????????????
          If ?lngA? Mod ? 2 ? = ? 0 ? Then
          ????????????????????lngA?
          = ?lngA? / ? 2
          ????????????????
          Else
          ????????????????????lngB?
          = ?lngB? / ? 2
          ????????????????
          End ? If
          ????????????
          End ? If
          ????????
          End ? If
          ????
          Loop
          ????
          If ?lngA? = ? 0 ? Then
          ????????lngResult?
          = ?lngC? * ?lngB
          ????
          Else
          ????????lngResult?
          = ?lngC? * ?lngA
          ????
          End ? If
          ????
          ????fStein?
          = ?lngResult

          End?Function

          ??????最小公倍數 = M * N / 最大公約數


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          i am ddm

          主站蜘蛛池模板: 淳安县| 定襄县| 黄浦区| 弋阳县| 虎林市| 秀山| 山东省| 罗源县| 邻水| 炉霍县| 通州市| 昌宁县| 乌兰浩特市| 内江市| 来宾市| 察雅县| 哈尔滨市| 呼图壁县| 陇南市| 弥渡县| 固原市| 定安县| 上犹县| 双城市| 兰州市| 庆元县| 承德县| 赫章县| 集安市| 江永县| 交城县| 丹江口市| 苏州市| 堆龙德庆县| 萨嘎县| 镇宁| 济南市| 邵阳县| 福泉市| 江孜县| 石屏县|