📜  数组中所有梅森数字的总和(1)

📅  最后修改于: 2023-12-03 15:40:02.853000             🧑  作者: Mango

数组中所有梅森数字的总和

概述

本程序用于找出给定数组中所有的梅森数字,并将其求和。梅森数字是一个形如2^n - 1的素数,其中n也必须是素数。

示例

给定数组:[3, 7, 31, 127, 2047]

该数组中,3和7不是梅森数字,31是梅森数字(31 = 2^5 - 1),但31并不是素数,所以它不算作我们要求的梅森数字。127是梅森数字(127 = 2^7 - 1),而且是素数,2047也是梅森数字(2047 = 2^11 - 1),但不是素数。因此,返回值应为127。

算法
  1. 遍历给定数组。

  2. 对于每一个元素,检查其是否为梅森数字。

    2.1 通过快速幂,判断其是否为形如2^n - 1的数。

    2.2 判断n是否为素数。

    2.3 如果两者均符合,则该元素为梅森数字,将其加入sum中。

  3. 返回sum的值。

代码
Python
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def is_mersenne(n):
    if n == 1:
        return False
    m = 2
    while m ** 2 - 1 <= n:
        if m ** 2 - 1 == n and is_prime(m):
            return True
        m += 1
    return False

def sum_of_mersenne_numbers(arr):
    sum = 0
    for n in arr:
        if is_mersenne(n):
            sum += n
    return sum
Java
public static boolean isPrime(int n) {
    if (n < 2) {
        return false;
    }
    for (int i = 2; i <= Math.sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

public static boolean isMersenne(int n) {
    if (n == 1) {
        return false;
    }
    int m = 2;
    while (Math.pow(m, 2) - 1 <= n) {
        if (Math.pow(m, 2) - 1 == n && isPrime(m)) {
            return true;
        }
        m++;
    }
    return false;
}

public static int sumOfMersenneNumbers(int[] arr) {
    int sum = 0;
    for (int n : arr) {
        if (isMersenne(n)) {
            sum += n;
        }
    }
    return sum;
}
JavaScript
function isPrime(n) {
    if (n < 2) {
        return false;
    }
    for (let i = 2; i <= Math.sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

function isMersenne(n) {
    if (n == 1) {
        return false;
    }
    let m = 2;
    while (Math.pow(m, 2) - 1 <= n) {
        if (Math.pow(m, 2) - 1 == n && isPrime(m)) {
            return true;
        }
        m++;
    }
    return false;
}

function sumOfMersenneNumbers(arr) {
    let sum = 0;
    for (let n of arr) {
        if (isMersenne(n)) {
            sum += n;
        }
    }
    return sum;
}
总结

本文介绍了如何找出给定数组中所有的梅森数字,并将其求和。我们使用了快速幂和素数判定的算法来实现。具体而言,我们遍历给定数组,对于每一个元素,利用快速幂检查其是否为形如2^n -1的数,然后再利用素数判定算法检查n是否为素数,如果两者均符合,则该元素为梅森数字,将其加入sum中。最后返回sum的值即可。