1. 程式人生 > >學以致用——Java原始碼——最大公約數計算的普通演算法與歐幾里得演算法的比較(Greatest Common Divisor)

學以致用——Java原始碼——最大公約數計算的普通演算法與歐幾里得演算法的比較(Greatest Common Divisor)

Our life is frittered away by detail ... Simplify, simplify.

by Henry Thoreau

(美國哲學家亨利·梭羅說,我們的生活被瑣碎的細節消磨殆盡,要簡化,要簡化!)

所以,如果能夠找到現成的解決方案,我們就沒必要自己埋頭研究演算法了(除非我們的目的在於研究演算法本身!)。

package exercises.ch6Methods;

import java.util.*;

//JHTP Exercise 6.27 (Greatest Common Divisor)
//by [email protected]
/** * *6.27 (Greatest Common Divisor) The greatest common divisor (GCD) of two integers is the *largest integer that evenly divides each of the two numbers. Write a method gcd that *returns the greatest common divisor of two integers. [Hint: You might want to use Euclid’s algorithm. *You can find information about it at en.wikipedia.org/wiki/Euclidean_algorithm.] Incorporate the method *into an application that reads two values from the user and displays the result. * */ public class GreatedCommonDivisor { //此演算法基於本人2008年的求最大公約數的方法,https://blog.csdn.net/hpdlzu80100/article/details/2290499 public static long gcd1(long n1, long n2) { long g = 0; for(long i=1;i<=Math.min(n1,n2);i++) { if (n1 % i == 0 && n2 % i == 0) g = i; } return g; } //此演算法https://blog.csdn.net/jiaolipe/article/details/1476068,採用了Euclid’s algorithm(歐幾里得演算法) private static long gcd2 (long num1, long num2){ while (num1 != num2) { if (num1 > num2) num1 = num1 - num2; else num2 = num2 - num1; } return num1; } public static void main(String args[]) { long number1; long number2; long gcd1; long gcd2; Scanner scan=new Scanner(System.in); do { System.out.printf("請輸入第一個整數(輸入-1退出):"); number1 = scan.nextLong(); if(number1 == -1) {System.out.print("已退出程式。"); break; } System.out.printf("請輸入第二個整數(輸入-1退出):"); number2 = scan.nextLong(); if(number2 == -1) {System.out.print("已退出程式。"); break; } long beginTime=System.nanoTime(); gcd1 = gcd1(number1, number2); long endTime=System.nanoTime(); double duration1=(double)(endTime-beginTime); System.out.printf("方法1:%d和%d的最大公約數為:%d,共用時%f納秒%n", number1, number2, gcd1, duration1); beginTime=System.nanoTime(); gcd2 = gcd2(number1, number2); endTime=System.nanoTime(); double duration2=(double)(endTime-beginTime); System.out.printf("方法2:%d和%d的最大公約數為:%d,共用時%f納秒%n", number1, number2, gcd2, duration2); System.out.printf("方法2的用時是方法1的%.2f%%%n", duration2/duration1 * 100); System.out.println(); } while (number1 != -1); System.out.println("已退出程式。"); scan.close(); } }

執行結果:

請輸入第一個整數(輸入-1退出)6666

請輸入第二個整數(輸入-1退出)9999

方法166669999的最大公約數為:3333,共用時701450.000000納秒

方法266669999的最大公約數為:3333,共用時9078.000000納秒

方法2的用時是方法11.29%

 

請輸入第一個整數(輸入-1退出)34567

請輸入第二個整數(輸入-1退出)3456

方法1345673456的最大公約數為:1,共用時415659.000000納秒

方法2345673456的最大公約數為:1,共用時13421.000000納秒

方法2的用時是方法13.23%