目录
实现语言:C
编译器:gcc
题目链接:
题目:
2022-高级语言程序设计练习——循环结构程序设计
7-16 梅森数
分数 20
作者 颜晖
单位 浙大城市学院
形如的素数称为梅森数(Mersenne Number)。例如
、
都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了
是一个素数,堪称当时世界上“已知最大素数”的一个记录。
本题要求编写程序,对任一正整数n(n<20),输出所有不超过的梅森数。
输入格式:
输入在一行中给出正整数n(n<20)。
输出格式:
按从小到大的顺序输出所有不超过的梅森数,每行一个。如果完全没有,则输出“None”。
输入样例:
6
输出样例:
3
7
31
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
AC代码:
#include <stdio.h>
#include <math.h> //double pow(double, double)
int main()
{
int n;
scanf("%d", &n); // 输入在一行中给出正整数n(n<20)。
if (n >= 2) // 最小n==2
{
for (int i = 2; i <= n; i++) // 遍历2^2-1到2^n-1的所有数
{
int fact = 2;
for (int j = 1; j < i; j++)
{
fact = fact * 2;
}
fact = fact - 1;
// fact = pow(2,i)-1
// 判断素数------------------------------------
// 定义flag,当flag==1认为fact是素数,当flag==0认为fact不是素数
int flag;
flag = 1; // 默认为fact是素数,只有以下情况才会认为fact不是素数
if (fact <= 4) // 当fact<5时,只有fact==1或者fact==4会认为fact不是素数
{
if (fact == 1 || fact == 4)
{
flag = 0;
}
}
else // 当fact>=5时
{
if ((fact % 6) != 1 && (fact % 6) != 5) // 如果fact%6为2,3,4中任意一个,那么fact都不是素数
{
flag = 0;
}
else
{
for (int i = 5; i <= sqrt(fact); i += 6) // 对于%6==1或者5的数,对它用一般的素数判断方法,从5开始寻找因子,步长为6,到sqrt(fact)为止
{
if (fact % i == 0 || fact % (i + 2) == 0)
{
flag = 0;
break;
}
}
}
}
// 判断素数------------------------------------
if (flag == 1) // 如果2^i-1是素数,则按照题目要求输出
{
printf("%d\n", fact); // 按从小到大的顺序输出所有不超过2^n−1的梅森数,每行一个。
}
}
}
else // 如果完全没有,则输出“None”。
{
printf("None\n");
}
return 0;
}