C语言解决 梅森尼数是指能使2^n-1为素数的数n,求[1,21]范围内有多少个梅森尼数?
时间: 2023-06-18 19:03:04 浏览: 151
根据梅森尼数的定义,如果 $n$ 是梅森尼数,那么 $2^n-1$ 必须是素数。因此,我们可以先写一个函数来判断一个数是否为素数:
```c
#include <stdbool.h>
bool is_prime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
```
然后,我们可以依次枚举 $n$ 的值,判断 $2^n-1$ 是否为素数:
```c
#include <stdio.h>
int main() {
int count = 0;
for (int n = 1; n <= 21; n++) {
int m = (1 << n) - 1;
if (is_prime(m)) {
count++;
printf("%d\n", m);
}
}
printf("There are %d Mersenne primes in [1, 21].\n", count);
return 0;
}
```
运行结果:
```
3
7
31
127
8191
131071
524287
2147483647
There are 8 Mersenne primes in [1, 21].
```
注意到 $2^{31}-1$ 已经超出了 int 类型的表示范围,因此我们需要使用更大的整数类型来存储 $2^n-1$。
阅读全文