【问题描述】梅森数:形如
的素数称为梅森数。例如
都是梅森数。1722年,双目失明的瑞士数学大师欧拉(Euler)证明了
是一个素数,堪称当时世界上“已知最大素数”的一个记录。输入一个正整数n(n<20),编程输出所有不超过
的所有梅森数。如果输入的数据不合法,则输出Error.。没有梅森数,则输出no Mersenne Number.,(参考样例输入)
(提示:定义两个标志变量,一个用于标记是否为素数,一个用于标记是否为梅森数)
【样例输入1】6
【样例输出1】
3 is a Mersenne Number.
7 is a Mersenne Number.
31 is a Mersenne Number.
【样例输入2】1
【样例输出2】
no Mersenne Number.
【样例输入3】0
【样例输出3】
Error.
【样例说明】无
【评分标准】 正确得满分。
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
// 函数声明,用于检查一个数是否为素数
bool isPrime(long long number);
int main() {
int n;
int i;
// 获取输入
scanf("%d", &n);
// 检查输入是否合法
if (n <= 0 || n >= 20) {
printf("Error.\n");
return 0;
}
// 输出梅森数
// 处理 n = 1 的特殊情况
if (n == 1) {
printf("no Mersenne Number.\n");
} else {
for ( i = 0; i < n; ++i) {
long long mersenne = (1LL << i) - 1; // 使用长整型避免溢出
// 检查是否为素数,并输出结果
if (isPrime(mersenne)) {
printf("%lld is a Mersenne Number.\n", mersenne);
}
}
}
return 0;
}
// 检查一个数是否为素数的函数
bool isPrime(long long number) {
long long i;
if (number < 2) {
return false; // 小于2的数不是素数
}
for (i = 2; i <= sqrt(number); ++i) {
if (number % i == 0) {
return false; // 能被整除,不是素数
}
}
return true; // 没有找到可以整除的因子,是素数
}