📅  最后修改于: 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。
遍历给定数组。
对于每一个元素,检查其是否为梅森数字。
2.1 通过快速幂,判断其是否为形如2^n - 1的数。
2.2 判断n是否为素数。
2.3 如果两者均符合,则该元素为梅森数字,将其加入sum中。
返回sum的值。
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
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;
}
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的值即可。