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

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

对于最大公约数和最小公倍数的解法,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
相关文章
|
2月前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字
【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字
|
2月前
|
算法
给定两个数,求这两个数的最大公约数
给定两个数,求这两个数的最大公约数
|
2月前
|
算法 测试技术 C#
【位运算 拆位法 二分】3007. 价值和小于等于 K 的最大数字
【位运算 拆位法 二分】3007. 价值和小于等于 K 的最大数字
|
2月前
|
算法 测试技术 C++
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
|
2月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
2月前
|
C++ Java Go
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
38 0
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
判断一个数字是否可以表示成三的幂的和(难度:中等)
判断一个数字是否可以表示成三的幂的和(难度:中等)
|
2月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
52 0
|
算法 C++
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
素数又称为质数,它指在一个大于1的自然数中,除了1和它自身外,没法被其他自然数整除的数。比1大,但不是素数的数称为合数。0和1既不是素数,也不是合数。因为素数的分布没有明显的规律,所以在程序中一般根据素数的定义来判断该数是否为素数。例如哥德巴赫猜想:哥德巴赫通过大量的数据猜测,所有不小于6的偶数,都可以表示为两个奇素数之和。后人将其称之为“1+1”。并且,对于每个不小于9的奇数,都可以表示为三个奇素数之和。
263 0
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
旋转数组的最小数字(简单难度)
旋转数组的最小数字(简单难度)
60 0
旋转数组的最小数字(简单难度)