日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求两数的最大公约数算法

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求两数的最大公约数算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最大公約數,也稱最大公因數、最大公因子,指兩個或多個整數共有約數中最大的一個;

a,b的最大公約數記為(a,b),同樣的,a,b,c的最大公約數記為(a,b,c),多個整數的最大公約數也有同樣的記號;

?求最大公約數有多種方法,常見的有質因數分解法、短除法、歐幾里得算法(又稱輾轉相除法)更相減損法

資料來源:百度百科-最大公約數 鏈接

質因數分解法&短除法較依賴計算者,靈活性也很大,步驟不固定,本文作者僅使用Java代碼實現歐幾里得算法(又稱輾轉相除法)&更相減損法,具體如下:

一、歐幾里得算法(又稱輾轉相除法)

package algorithm.maxCommonDivisor;/*** 求兩個數的最大公約數* 歐幾里得算法(又稱輾轉相除法)** @author XUQIANG_DUAN* @date 2019/7/29* @time 9:21*/ public class EuclideanAlgorithm {/*** 輾轉相除法** @param a* @param b* @return 最大公約數*/private static int euclidMethod(int a, int b) {/*** 大值&小值*/int maxI = a > b ? a : b;int minI = a > b ? b : a;/*** 余數*/int remainder = maxI % minI; // System.out.println("余數為:" + remainder);/*** 余數為零,小值為最大公約數* 余數為一,一為最大公約數* 大值&小值的最大公約數與小值與余數的最大公約數相同*/if (remainder == 0) {return minI;} else if (remainder == 1) {return remainder;} else {return euclidMethod(minI, remainder);}}/*** 運行時間&結果記錄* currentTimeMillis 為毫秒時間戳* nanoTime 為納秒時間戳* 1 秒 = 10^3 毫秒* 1 秒 = 10^9 納秒** @param a* @param b*/private static void timeConsume(int a, int b) {// long start = System.currentTimeMillis();long nstart = System.nanoTime();System.out.println("(" + a + ", " + b + ") | result = " + euclidMethod(a, b)); // long end = System.currentTimeMillis();long nend = System.nanoTime(); // System.out.println("共耗時(單位:ms):" + (end - start) + " | 結束點:" + end + " | 開始點:" + start);System.out.println("共耗時(單位:ns):" + (nend - nstart) + " | 結束點:" + nend + " | 開始點:" + nstart);}public static void main(String[] args) {timeConsume(55, 55);timeConsume(66, 55);timeConsume(10000, 10001);timeConsume(10000, 10003);timeConsume(1350, 1266);timeConsume(1000000, 1000003);} }

代碼運行結果如下:
...

(55, 55) | result = 55
共耗時(單位:ns):438614 | 結束點:89819135569674 | 開始點:89819135131060
(66, 55) | result = 11
共耗時(單位:ns):21049 | 結束點:89819135643629 | 開始點:89819135622580
(10000, 10001) | result = 1
共耗時(單位:ns):17636 | 結束點:89819135685727 | 開始點:89819135668091
(10000, 10003) | result = 1
共耗時(單位:ns):23325 | 結束點:89819135732376 | 開始點:89819135709051
(1350, 1266) | result = 6
共耗時(單位:ns):31858 | 結束點:89819135789265 | 開始點:89819135757407
(1000000, 1000003) | result = 1
共耗時(單位:ns):27876 | 結束點:89819135849567 | 開始點:89819135821691

Process finished with exit code 0

二、更相減損法

package algorithm.maxCommonDivisor;/*** 求兩個數的最大公約數* 更相減損法** @author XUQIANG_DUAN* @date 2019/7/29* @time 10:24*/ public class Subtraction {private static int subMethon(int a, int b) {int result = 1;/*** 大值&小值*/int maxI = a > b ? a : b;int minI = a > b ? b : a;/*** 大值&小值都為偶數,先簡約*/while (maxI % 2 == 0 && minI % 2 == 0) {result *= 2;maxI /= 2;minI /= 2;}/*** 差值*/int sub = maxI - minI; // System.out.println("差值為:" + sub + " | 大值為:" + maxI + " | 小值為:" + minI + " | 結果為:" + result);if (sub == 0) {result *= minI;} else if (sub == 1) {result *= 1;} else {result *= subMethon(minI, sub);}return result;}/*** 運行時間&結果記錄* currentTimeMillis 為毫秒時間戳* nanoTime 為納秒時間戳* 1 秒 = 10^3 毫秒* 1 秒 = 10^9 納秒** @param a* @param b*/private static void timeConsume(int a, int b) {// long start = System.currentTimeMillis();long nstart = System.nanoTime();System.out.println("(" + a + ", " + b + ") | result = " + subMethon(a, b)); // long end = System.currentTimeMillis();long nend = System.nanoTime(); // System.out.println("共耗時(單位:ms):" + (end - start) + " | 結束點:" + end + " | 開始點:" + start);System.out.println("共耗時(單位:ns):" + (nend - nstart) + " | 結束點:" + nend + " | 開始點:" + nstart);}public static void main(String[] args) {timeConsume(5,55);timeConsume(66,55);timeConsume(10000,10001);timeConsume(10000,10003);timeConsume(1350, 1266);timeConsume(1000000, 1000003);} }

代碼運行如下:

...
(5, 55) | result = 5
共耗時(單位:ns):445440 | 結束點:90158027966585 | 開始點:90158027521145
(66, 55) | result = 11
共耗時(單位:ns):43235 | 結束點:90158028074105 | 開始點:90158028030870
(10000, 10001) | result = 1
共耗時(單位:ns):31289 | 結束點:90158028144648 | 開始點:90158028113359
(10000, 10003) | result = 1
共耗時(單位:ns):753209 | 結束點:90158028942799 | 開始點:90158028189590
(1350, 1266) | result = 6
共耗時(單位:ns):39253 | 結束點:90158029022443 | 開始點:90158028983190
Exception in thread "main" java.lang.StackOverflowError 【棧內存溢出異常】
?? ?at algorithm.maxCommonDivisor.Subtraction.subMethon(Subtraction.java:40)

...

Disconnected from the target VM, address: '127.0.0.1:54677', transport: 'socket'

Process finished with exit code 1

結束語

更相減損法較輾轉相除法時間&空間復雜度都較高,也極易發生棧內存溢出異常,原因也不難理解,乘除為加減的高級運算同時效率也倍增。

?

?

總結

以上是生活随笔為你收集整理的求两数的最大公约数算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 人人爱av | 免费观看视频在线观看 | 男女男精品网站 | 人人妻人人澡人人爽欧美一区双 | av中文在线| 成人看片黄a免费看视频 | 美女洗澡隐私免费网站 | 亚洲精品高清视频在线观看 | 91看片免费版 | 99久久久无码国产精品免费蜜柚 | 亚洲欧洲成人精品久久一码二码 | 亚洲永久免费av | 日本午夜精品理论片a级app发布 | 日本一二三视频 | 中文字幕一区二区三区电影 | 性欧美久久久 | 青草99 | 国产一二视频 | 一本—道久久a久久精品蜜桃 | 日韩av线上 | 可乐操亚洲 | 亚洲啊v在线 | 国产真实的和子乱拍在线观看 | 天天爽天天摸 | 小辣椒福利视频导航 | 毛片aaaaa| 另类小说婷婷 | 欧美国产视频一区 | 51av视频| 国产在线播放网站 | 鲁丝av| av资源网址 | 九色91popny蝌蚪新疆 | 韩国三级bd高清中字2021 | 少妇无码av无码专区在线观看 | www伊人 | 久久久精品在线 | 色婷婷综合久久 | 色哟哟国产 | 欧美性猛交富婆 | 日韩久久精品 | 在线免费观看av不卡 | 国产性一乱一性一伧一色 | 青青草久久久 | 稀缺小u女呦精品呦 | 国产美女精品视频 | 美女露胸露尿口 | av片在线免费看 | 中文字幕欧美在线 | 国产福利久久久 | 日韩免费黄色片 | 国产视频一二三 | 中文字幕在线免费播放 | 亚洲成人福利在线 | 久久精品—区二区三区舞蹈 | 午夜天堂影院 | 男女国产精品 | 久久久久久久久久久久Av | 中文字幕免费在线观看视频 | 91久久久久国产一区二区 | 成人在线观看国产 | 色综合久久中文字幕无码 | 日批视频网站 | 中文字幕乱视频 | 国产综合视频 | 国产成人影视 | 国产成人一区二区三区小说 | 激情啪啪网站 | 99热.com| 99超碰在线观看 | 日韩av电影手机在线观看 | 91免费播放 | 天堂网中文字幕 | 69堂精品 | a∨色狠狠一区二区三区 | 亚洲私人影院 | 激情欧美一区二区三区精品 | 手机av免费 | 欧美三级色图 | 欧美一区二区三区在线 | 国产一区二区三区四区五区六区 | 小柔好湿好紧太爽了国产网址 | 欧美性猛交乱大交 | 色屁屁一区二区三区视频 | 国产在线麻豆 | 国产高清免费av | 中文字幕第22页 | 日韩人妻一区二区三区蜜桃视频 | 天堂视频中文在线 | 另类综合网 | 日本成人在线一区 | 色欲久久久天天天精品综合网 | 国产欧美日韩综合精品 | 欧美又大粗又爽又黄大片视频 | 亚洲狼人综合 | 国产午夜三级 | 亚洲色精品三区二区一区 | 日韩二区 | 日韩少妇裸体做爰视频 |