最小公倍和最大公约数的一般解决方案

简介: 最小公倍和最大公约数的一般解决方案

对于最大公约数和最小公倍数的解法,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
相关文章
|
7月前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字
【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字
|
7月前
|
Python
一个大于1的自然数,除了1和它本身外,不能被
一个大于1的自然数,除了1和它本身外,不能被
|
7月前
|
算法 测试技术 C#
【位运算 拆位法 二分】3007. 价值和小于等于 K 的最大数字
【位运算 拆位法 二分】3007. 价值和小于等于 K 的最大数字
|
7月前
|
算法 测试技术 C++
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
判断一个数字是否可以表示成三的幂的和(难度:中等)
判断一个数字是否可以表示成三的幂的和(难度:中等)
|
机器学习/深度学习 C语言
C语言:给定两个数,求这两个数的最大公约数(新思路:辗转相除法)
思路一:普通方法 总体思路: (一). 生成相关变量; 从键盘输入两个数;
148 0
C语言:给定两个数,求这两个数的最大公约数(新思路:辗转相除法)
旋转数组的最小数字(简单难度)
旋转数组的最小数字(简单难度)
78 0
旋转数组的最小数字(简单难度)
|
算法
背包问题求方案数(一)
AcWing算法提高课内容,本文讲解 动态规划
160 0
背包问题求方案数(一)
|
人工智能 算法 Windows
背包问题求方案数(二)
AcWing算法提高课内容,本文讲解 动态规划
210 0
背包问题求方案数(二)
|
测试技术
软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
472 0