常规算法
常规算法
-
优化算法分享(来自程序6)
求解两个数的最小公倍数和最大公约数
如果在算法过程中对整个的循环的上限做动态调整可以节约大量时间
// 原方法 public static int maxCommonDivisor(int num1,int num2){ int result = 1; int tmp = num1>num2? num2 :num1; for (int i = 2; i <= tmp; i++) { if(num1%i == 0 && num2%i == 0){ result = i*result; num1 = num1/i; num2 = num2/i; i=1; } } return result; } // 可以看到方法在运送过程中, i 的上限始终是 num1与num2最小值 // 我们在写方法的时候可以考虑到,两个数的最大公约数肯定不会大于最小的那么数的一半,比如 10 与 8 的最大公约数 不会超过 8的一半; // 同时我们在循环体内部,可以看到,每次执行一边循环体,num1与num2就会取一次除数。在i的增加过程中,假如某一次 i=2 不能整除,那么后续过程中也不会有 i=2 可以整除的数,那么我们可以改 i=1 为 i--; // 修改后 private static int maxCommonDivision(int num1, int num2){ int result = 1; for (int i = 2; i <= Math.min(num1 , num2); i++){ if (num1 % i == 0 && num2 % i == 0){ result *= i; num1 /= i; num2 /= i; i--; } } return result; } // 修改后的算法可以大幅节约时间,i 所取的上限随着取除数之后快速减小,而且不会重复计算 i 之前的值