leetcode——数学

本文主要探讨了LeetCode中与数学相关的问题,包括素数分解、整除、最大公约数最小公倍数、进制转换等。通过实例介绍了如何求解最大公约数、最小公倍数,并讲解了如何使用位操作和减法求解最大公约数。此外,还涉及到了不同进制转换的算法,如7进制、16进制和26进制。
摘要由CSDN通过智能技术生成

素数分解

每一个数都可以分解成素数的乘积,例如 84 = 22 * 31 * 50 * 71 * 110 * 130 * 170 * …

整除

令 x = 2m0 * 3m1 * 5m2 * 7m3 * 11m4 * …

令 y = 2n0 * 3n1 * 5n2 * 7n3 * 11n4 * …

如果 x 整除 y(y mod x == 0),则对于所有 i,mi <= ni。

最大公约数最小公倍数

x 和 y 的最大公约数为:gcd(x,y) = 2min(m0,n0) * 3min(m1,n1) * 5min(m2,n2) * …

x 和 y 的最小公倍数为:lcm(x,y) = 2max(m0,n0) * 3max(m1,n1) * 5max(m2,n2) * …

生成素数序列

204. Count Primes (Easy)

埃拉托斯特尼筛法在每次找到一个素数时,将能被素数整除的数排除掉。

function countPrimes(n) {
   
    var notPrimes = [];
    for (var i = 0; i < n+1; i++) {
   
        notPrimes.push(false);
    }

    var count = 0;
    for(var j = 2; j < n; j++) {
   
        if(notPrimes[j]) {
   
            continue;
        }
        count++;
        for(var k = j*j; k < n; k += j) {
   
            notPrimes[k] = true;
        }
    }
    return count;
}
def notPrimes(n):
    notPrimes = [False for _ in range(n+1)]
    count = 0
    for i in range(2, n+1):
        if notPrimes[i]:
            continue
        count += 1
        for j in range(i*i, n+1, i):
            notPrimes[j] = True
    return count

最大公约数

function gcd(a, b) {
   
    return b == 0? a :gcd(b, a%b);
}
def gcd(a, b):
    return a if b == 0 else gcd(b, a%b)

最小公倍数为两数的乘积除以最大公约数。

function lcm(a, b){
   
    return a*b/gcd(a, b)
}
def lcm(a, b):
    return a*b//gcd(a, b)

使用位操作和减法求解最大公约数

编程之美:2.7

对于 a 和 b 的最大公约数 f(a, b),有:

  • 如果 a 和 b 均为偶数,f(a, b) = 2*f(a/2, b/2);
  • 如果 a 是偶数 b 是奇数,f(a, b) = f(a/2, b);
  • 如果 b 是偶数 a 是奇数,f(a, b) = f(a, b/2);
  • 如果 a 和 b 均为奇数,f(a, b) = f(b, a-b);

乘 2 和除 2 都可以转换为移位操作。

function gcd(a,b) {
   
    //使用位操作和减法求最大公约数
    if(a<b) {
   
        return gcd(b,a);
    }

    if(b == 0) {
   
        return a;
    }

    function isEven(n){
   
        if(typeof n !== 'number'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值