java中辗转相除法求最大公约数的多线程限制

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占用率过高,且无法自行释放。在更换第二版代码后,不仅不会出现上述情况,对整体运行速度也有一定提升。

泛用性不高,仅记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值