Java循环取余法求公约数原代码
public static double getGreatestCommonFactor(double coeff1, double coeff2) {
int result = 1;
double num1 = double coeff1;
double num2 = double coeff2;
double r = num1 % num2;
result = num2;
/*能除尽的除数即为最大公因子*/
while (r != 0) {
num1 = num2;
num2 = r;
result = num2;
r = num1 % num2;
count++;
}
/*最大公因子不能为0*/
return Math.abs(result);
}
添加最大循环次数限制,并改为int类型运算后代码
public static double getGreatestCommonFactor(double coeff1, double coeff2) {
int result = 1;
//将此处转为int类型进行计算,减少计算次数
int num1 = (int) coeff1;
int num2 = (int) coeff2;
int r = num1 % num2;
result = num2;
/*能除尽的除数即为最大公因子*/
int count = 0;
int threshold = 100;
while (r != 0) {
num1 = num2;
num2 = r;
result = num2;
r = num1 % num2;
count++;
//做最大循环次数限制,保证多线程运行时不会陷入无限循环调用
if (count > threshold) {
return 1;
}
}
//long endTime = System.currentTimeMillis();
/*最大公因子不能为0*/
return Math.abs(result);
实测区别
首先因为部分数据的原因,第一版中使用double类型数据作为参数并参与运算,在实际运行中虽然正确性可以保证,并没有因为类型的问题导致运算错误。但是与第二版代码进行实测对比后,使用int作为参数,相比double类型参数效率未见提高,运算次数在随机测试例中保持一致,因为数据类型原因,输入的参数范围会小一些。
但在多线程的生产环境下,第一版代码中会因为多线程的复杂运行环境下,产生不限于循环调用、持续运行等问题,导致cpu占用率过高,且无法自行释放。在更换第二版代码后,不仅不会出现上述情况,对整体运行速度也有一定提升。
泛用性不高,仅记录。