当前位置: 首页 > 后端技术 > Java

stackoverflow 提问:“计算两个整数的最小公倍数的最有效方法是什么?”

时间:2023-04-01 17:27:14 Java

Stackoverflow闂細鈥滆绠椾袱涓暣鏁扮殑鏈€灏忓叕鍊嶆暟鐨勬渶鏈夋晥鏂规硶鏄粈涔堬紵鈥濇矇娣€銆佸垎浜€佹垚闀匡紝璁╄嚜宸卞拰浠栦汉鏈夋墍鏀惰幏锛侌煒?.鍓嶈█鍜︼紝鍌呭摜鎬庝箞绐佺劧璇存渶澶у叕绾︽暟浜嗭紵濡傛灉浣犺繖鏍锋兂锛岄偅浣犺偗瀹氭病鐪嬭繃涓婁竴绔犱粯鍝ヨ鐨凴SA绠楁硶銆傚浜庣敤娆ф媺缁撴灉璁$畻鍑烘潵鐨勮川鏁板叕閽锛屽叾瀹為渶瑕佺敤婊氬姩闄ゆ硶鏉ヨ绠楁渶澶у叕绾︽暟銆備笉鐢ㄦ媴蹇冿紝浣犲啓鐨勬墍鏈変唬鐮侀兘鏄暟鐞嗛€昏緫鐨勫叿浣撳疄鐜帮紝鏃犻潪鏄毦搴︾殑涓嶅悓鑰屽凡銆傛墍浠ュ鏋滀綘鐪熺殑鎯冲濂界紪绋嬫€濈淮鑰屼笉浠呬粎鏄疌RUD锛屼綘蹇呴』鍦ㄦ暟鎹粨鏋勩€佺畻娉曢€昏緫绛夋柟闈㈡墦濂藉熀纭€銆?.鏃㈢劧閮芥槸鐭櫎娉曪紝浣犺繕璁板緱濡備綍璁$畻鏈€澶х殑鍚楋紵鍏害鏁帮紝姝婚锛熶笂闈㈢殑鏂规硶鏄垜浠湪瀛︽牎瀛︾殑銆傝繖绉嶈绠楁柟娉曠О涓虹煭闄ゆ硶銆傜畝闄ゆ硶锛氭槸绠楁湳涓櫎娉曠殑涓€绉嶇畻娉曪紝灏嗛櫎娉曡浆鍖栦负涓€绯诲垪杩愮畻銆傜煭闄ゆ硶鏄暱闄ゆ硶鐨勭畝鍖栵紝閲岄潰鐢ㄥ埌浜嗗績绠楋紝鎵€浠ョ煭闄ゆ硶鏇撮€傚悎闄ゆ暟杈冨皬鐨勯櫎娉曘€傚浜庡ぇ澶氭暟浜烘潵璇达紝褰撻櫎浠?2鎴栨洿灏忕殑鏁版椂锛屽彲浠ヤ娇鐢ㄨ蹇嗕腑鐨勪箻娉曡〃鍐呭鍦ㄥ績閲岃繘琛岀煭闄ゆ硶銆傝繕鏈変竴浜涗汉鍙互澶勭悊鍏锋湁杈冨ぇ闄ゆ暟鐨勭煭闄ゆ硶銆傗€斺€旀憳鑷淮鍩虹櫨绉?.娆у嚑閲屽痉绠楁硶鐭櫎娉曞彲浠ヨВ鍐宠绠楁渶澶у叕绾︽暟鐨勯棶棰橈紝浣嗘槸鍦ㄧ紪绋嬩腑鎬绘槸寰堝埆鎵紝鏃犳硶涓€涓竴涓湴灏濊瘯鍜岃绠楁暟瀛楋紝鐪嬭捣鏉ュ緢鐑︿汉銆傚叾瀹為櫎浜嗙煭闄ゆ硶锛岃繕鏈変竴绉嶆眰鍏害鏁扮殑鏂规硶锛屽彨鍋氭姘忕畻娉曘€傛姘忕畻娉曪細鏄绠椾袱涓暣鏁帮紙鏁帮級鐨勬渶澶у叕绾︽暟[GCD锛圙reatestCommonDivisor锛塢锛屽嵆鑳藉皢瀹冧滑鏁撮櫎鑰屾棤浣欐暟鐨勬渶澶ф暟鐨勬湁鏁堟柟娉曘€傚畠浠ュ彜甯岃厞鏁板瀹舵鍑犻噷寰楃殑鍚嶅瓧鍛藉悕锛屾鍑犻噷寰峰湪浠栫殑銆婂嚑浣曞師鏈€嬶紙绾﹀叕鍏冨墠300骞达級涓娆℃弿杩颁簡瀹冦€傚畠鏄竴绉嶇畻娉曠殑绀轰緥锛屾槸鏍规嵁鏄庣‘瀹氫箟鐨勮鍒欓€愭鎵ц璁$畻鐨勮繃绋嬶紝骞朵笖鏄父鐢ㄧ殑鏈€鍙よ€佺殑绠楁硶涔嬩竴銆傚畠鍙敤浜庡皢鍒嗘暟绠€鍖栦负鏈€绠€鍗曠殑褰㈠紡锛屽苟涓旀槸璁稿鍏朵粬鏁拌鍜屽瘑鐮佽绠楃殑涓€閮ㄥ垎銆傗€斺€斿嚭鑷淮鍩虹櫨绉慓CD锛岃〃绀轰袱涓暟鐨勬渶澶у叕绾︽暟锛孏CD(X,Y)=Z锛屽垯琛ㄧずX鍜孻鐨勬渶澶у叕绾︽暟涓篫銆侴CD(X,Y)=GCD(Y,XmodY)鐢辨鍑犻噷寰楃畻娉曠粰鍑?mod琛ㄧず鍙栨ā璁$畻浣欐暟銆傚叾瀹炵畝鍗曟潵璇达紝X鍜孻鐨勫叕绾︽暟鏄痁锛岄偅涔圷鍜孼鐨勫叕绾︽暟涔熸槸Z銆?4鍜?8鐨勬渶澶у叕绾︽暟鏄?锛岄偅涔?8鍜?鐨勫叕绾︽暟涔熸槸6銆傚樋锛屽氨鏄繖鏍枫€備絾鏄洜涓鸿繖涓帹璁猴紝缂栫▼浠g爜鍙樺緱浼橀泤鑸掓湇锛屽彧闇€瑕佽繛缁噺鍘籜鍜孻涓や釜鏁板氨鍙互璁$畻鍑烘渶澶у叕绾︽暟銆傪煒傝繖璁╀粯鍝ユ兂璧蜂簡寰堝骞村墠鍦ㄥ鏍$殑鏃跺€欙紝鎴戜篃鎵i櫎浜嗭紱鈥滀换浣曚竴缁勪笁涓暟鍙互鏋勬垚绛夊樊绾ф暟锛屽苟涓斾竴涓笁浣嶆暟鍙互缁勫悎锛屽彲浠ュ緱鍒?鏁撮櫎銆傗€濅緥濡傦細绠楁湳鏁板垪16銆?1銆?6缁勫悎鎴愪笁浣嶆暟瀛?63116鎴?61631鍙互琚?鏁撮櫎銆?.EuclideanAlgorithm=EuclideanAlgorithm=EuclideanAlgorithm:https://en.wikipedia.org/wiki...鍦ㄧ炕婊氶櫎娉曠殑瀹炵幇锛岃绠楁渶澶у叕绾︽暟鐨勬柟娉曟槸鐢ㄤ竴涓暟鍑忓幓鍙︿竴涓暟锛岀洿鍒颁袱涓暟鐩稿悓鎴栬€呭叾涓竴涓暟涓?锛屽垯鍙栨渶鍚庝竴涓笉涓?鐨勬暟鏄袱涓暟鐨勬渶澶у叕绾︽暟銆備粯鍝ヨ繖閲屾彁渚涗簡涓ょ璁$畻鏂瑰紡锛屼竴绉嶆槸寰幆锛屼竴绉嶆槸閫掑綊銆傗€斺€旀柟渚垮緢澶氫笉鎳傞€掑綊鐨勬湅鍙嬫崲绉嶆柟寮忓涔犮€?.寰幆瀹炵幇publiclonggcd01(longm,longn){m=Math.abs(m);n=Math.abs(n);while(m!=0&&n!=0&&m!=n){濡傛灉(m>n){m=m-n;}else{n=n-m;}}杩斿洖m==0锛焠:m;}鍦ㄤ袱涓暟鐨勫惊鐜鐞嗕腑锛屾潯浠朵负m!=0&&n!=0&&m!=n鐩村埌寰幆缁撴潫銆?.閫掑綊瀹炵幇publiclonggcd02(longm,longn){if(mn){m=m-n;}else{n=n-m;}}杩斿洖m==0锛焠:m;}棣栧厛锛岃繖閲屼粙缁嶄竴涓瘮杈冪畝鍗曠殑鏂规硶锛屽熀浜庝袱涓暟鐨勪箻绉櫎浠ユ渶澶у叕绾︽暟锛屽緱鍒扮殑缁撴灉鏄渶灏忓叕鍊嶆暟銆?銆佺畝鍗曠疮鍔犺绠楄繖绉嶈绠楁柟娉曟槸鍦ㄤ竴涓叉鏁存暟涓壘鍑烘渶灏忕殑鏁帮紝杩涜鑷垜绱姞寰幆锛岀洿鍒版墍鏈夋暟閮界浉鍚岋紝鍒欒繖涓暟灏辨槸鏈€灏忓叕鍊嶆暟銆傗€斺€旇兘鐢ㄤ唬鐮佸疄鐜板悧锛焢ubliclonglcm02(long...n){long[]cache=n.clone();//鏉′欢鏄墍鏈夋暟瀛楅兘鐩哥瓑while(!isEquals(n)){System.out.println(JSON.toJSONString(n));闀挎渶灏忓€?n[0]锛沬ntidx=0;瀵逛簬(inti=0;in[i]){min=n[i];idx=鎴?}}n[idx]=缂撳瓨[idx]+min;}returnn[0];}鍦ㄤ唬鐮佸疄鐜颁腑锛岄鍏堣鍏嬮殕骞朵繚瀛榥涓暣鍨嬫暟缁勩€傚洜涓烘瘡娆$浉鍔犻兘鏄師搴忓垪涓殑鏁板瓧鍊笺€傛帴涓嬫潵灏辨槸浠ユ墍鏈夋暟浣滀负鏉′欢寰幆鍒ゆ柇锛屼笉鏂疮鍔犳渶灏忓€笺€傛渶鍚庤繑鍥炵殑鏄渶灏忓叕鍊嶆暟銆?.琛ㄦ帹婕旀硶琛ㄦ帹娉曟槸鐢ㄦ渶灏忕殑璐ㄦ暟2闄や竴缁勬暟锛岀洿鍒颁笉鑳借2鏁撮櫎锛岀户缁敤涓嬩竴涓川鏁?锛堝ぇ浜庢湰鏁扮殑鏈€灏忚川鏁帮級鏁撮櫎remainingnumbers)鐩村埌鎵€鏈夋暟閮戒负1鏃剁粨鏉熴€傛渶鍚庢墍鏈夋湁鏁堢礌鏁扮殑涔樼Н涓烘渶灏忓叕鍊嶆暟銆傗€斺€旀兂鎯冲鏋滆兘鐢ㄤ唬鐮佸疄鐜帮紝鑳戒笉鑳芥悶鍑烘潵锛焢ubliclonglcm03(long...n){Map>keys=newHashMap<>();瀵逛簬锛堥暱閿細n锛墈閿€俻ut(key,newArrayList(){{add(key);}});}System.out.print("鎵ц琛ㄨ绠楋細\r\nx");longprimality=2,cachePrimality=primality,filterCount=0,lcm=1;//浠ユ墍鏈夊厓绱犵殑鏈€鍚庝竴浣嶄负1涓烘潯浠秝hile(filterCount!=keys.size()){intrefresh=0;杩囨护鍣ㄨ鏁?0锛沠or(Map.Entry>entry:keys.entrySet()){longvalue=entry.getValue().get(entry.getValue().size()-1);濡傛灉锛堝€?=1锛墈filterCount++;}//鏁存暟闄ゆ硶澶勭悊if(value%primality==0){entry.getValue().add(value/primality);鍒锋柊++锛泒else{entry.getValue().add(value);}}//鍒锋柊闄ゆ暟if(refresh==0){for(Map.Entry>entry:keys.entrySet()){longvalue=entry.getValue().get(entry.getValue().size()-1);//瀵绘壘涓嬩竴涓尮閰嶇殑绱犳暟if(value>primality||(valueprimality)){cachePrimality=value;}entry.getValue().remove(entry.getValue().size()-1);}primality=cachePrimality;}else{//绱Н涔樼Нlcm*=cachePrimality;System.out.print(cachePrimality+"");}}keys.forEach((key,values)->{System.out.println();for(longv:values){System.out.print(v+"");}});System.out.println("\r\n");returnlcm;}鍦ㄤ唬鐮佸疄鐜颁腑鎴戜滑閫氳繃Map浣滀负琛ㄧ殑key锛孧ap涓殑List浣滀负琛ㄦ瘡涓€琛岀殑鏁版嵁锛岄€氳繃杩欐牱鐨勭粨鏋勬潵鏋勯€犺〃銆傛帴涓嬫潵寰幆澶勭悊鏁版嵁锛屾潯浠舵槸鎵€鏈夊厓绱犵殑鏈€鍚庝竴浣嶄负1锛屽垪琛ㄤ腑鐨勬暟鎹兘琚墠2鏁撮櫎涓鸿川鏁帮紝瀛樺叆涓嬩竴缁勬暟缁勩€傚綋2涓嶅彲鏁撮櫎鏃讹紝鍒锋柊绱犳暟锛岄€夋嫨鍙︿竴涓垪琛ㄤ腑鏈€灏忕殑绱犳暟浣滀负闄ゆ暟缁х画銆傚湪杩欎釜杩囩▼涓紝瀵规湁鏁堣川鏁扮殑涔樼Н杩涜绱姞锛岃繖涓箻绉殑鏈€缁堢粨鏋滃氨鏄渶灏忓叕鍊嶆暟銆傚叓銆佹祴璇曢獙璇佸崟鍏冩祴璇旲Testpublicvoidtest_euclidean(){LastCommonMultiplelastCommonMultiple=newLastCommonMultiple();//System.out.println("鏈€灏忓叕鍊嶆暟锛?+lastCommonMultiple.lcm01(2,7));System.out.println("鏈€灏忓叕鍊嶆暟锛?+lastCommonMultiple.lcm02(3,4,6));//System.out.println("鏈€灏忓叕鍊嶆暟锛?+lastCommonMultiple.lcm03(3,4,6));System.out.println("鏈€灏忓叕鍊嶆暟锛?+lastCommonMultiple.lcm03(3,4,6,8));//System.out.println("鏈€灏忓叕鍊嶆暟锛?+lastCommonMultiple.lcm03(4,7,12,21,42));}娴嬭瘯缁撴灉绱姞璁$畻锛歔3,4,6][6,4,6][6,8,6][9,8,6][9,8,12][9,12,12]鏈€灏忓叕鍊嶆暟锛?2杩涜琛ㄨ绠楋細x222333331421116333184211鏈€灏忓叕鍊嶆暟锛?4娴嬭瘯鍒版缁撴潫銆傛湰绔犱粙缁嶄笁绉嶈绠楁渶灏忓叕鍊嶆暟鐨勬柟娉曘€傞偅涔堝鏋滀綘鍙湅鍒伴€昏緫锛屼綘鑳藉啓鍑烘渶缁堢殑浠g爜鍚楋紵9銆佸父瑙侀潰璇曚腑鏈€澶у叕绾︽暟鏈変粈涔堢敤锛熷浣曠敤浠g爜瀹炵幇鏈€澶у叕绾︽暟鐨勮绠楋紵浣犵煡閬撴鍑犻噷寰楃畻娉曞悧锛熷叧浜庢暟璁猴紝浣犺繕璁板緱澶氬皯锛熶负浠€涔圧SA鍔犲瘑绠楁硶闇€瑕佺敤鍏害鏁拌绠楋紵濡備綍璁$畻涓や釜鏁扮殑鏈€灏忓叕鍊嶆暟锛熷浣曡绠楀涓暣鏁扮殑鏈€灏忓叕鍊嶆暟锛熶綘鑳藉憡璇夋垜濡備綍瀹炵幇X鐨勮繖涓绠楄繃绋嬪悧锛熶綘鐭ラ亾鏈€灏忓叕鍊嶆暟鐨勮绠楁槸涓轰簡浠€涔堝悧锛熻绠椾袱涓暣鏁扮殑鏈€灏忓叕鍊嶆暟鐨勬渶鏈夋晥鏂规硶鏄粈涔堬紵锛歨ttps://stackoverflow.com/que...鏈€灏忓叕鍊嶆暟锛歨ttps://en.wikipedia.org/wiki...Chebyshev鍑芥暟锛歨ttps://en.wikipedia.org/wiki...娆у嚑閲屽痉绠楁硶锛歨ttps://en.wikipedia.org/wiki...绾挎€х粍鍚堬細https://en.wikipedia.org/wiki..Bezu瀹氱悊:https://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity