对于最大公约数和最小公倍数的解法,BigInteger API提供了一个一般性的解决方案,可以根据例子来理解使用:
示例:
给你一个整数数组 nums 和一个整数 k , 请你统计并返回 nums 的 子数组 中满足 元素最小公倍数为 k 的子数组数目。 子数组 是数组中一个连续非空的元素序列。 数组的最小公倍数 是可被所有数组元素整除的最小正整数。 输入:nums = [3,6,2,7,1], k = 6 输出:4 解释:以 6 为最小公倍数的子数组是: - [3,6,2,7,1] (3,6) - [3,6,2,7,1]. (3,6,2) - [3,6,2,7,1]. (6) - [3,6,2,7,1]. (6,2)
解法:
import java.math.BigInteger; class Solution { public int subarrayLCM(int[] nums, int k) { int res = 0; for (int i = 0; i < nums.length; i++) { // 初始化为 1,任何数与 1 的 lcm 都是它本身 BigInteger lcm = BigInteger.ONE; for (int j = i; j < nums.length; j++) { // lcm(a, b) = a * b / gcd(a, b) lcm = lcm.multiply(BigInteger.valueOf(nums[j])).divide(lcm.gcd(BigInteger.valueOf(nums[j]))); // 担心溢出就用 lcm.doubleValue() if (lcm.intValue() == k) res++; } } return res; } }
思路和主要方法:
最小公倍 = 两数相乘/最大公约 API方法: a. this.gcd(val):返回最大公约数 gcd(this,val) b. this.multiply(val): 返回两数乘积 this * val c. this.divide(val): 返回两数相除的结果 this / val