题目描述
输入两个正整数m和n,输出m和n之间的所有素数。
要求程序定义一个prime()函数和一个main()函数,prime()函数判断一个整数n是否是素数,其余功能在main()函数中实现。
int prime(int n)
{
//判断n是否为素数, 若n为素数,本函数返回1,否则返回0
}
输入
输入两个正整数m和n,m<=n,且都在int范围内。
输出
输出占一行。输出m和n之间的所有素数,每个数后有一个空格。测试数据保证m到n之间一定有素数。
样例输入
2 6
样例输出
2 3 5
思路:
这个题目和之前的求素数的很像,只是要求用函数判断该数是不是素数,是的话就输出,通过循环进行判断m,n之间有多少素数。
代码:
#include <stdio.h>
#include <math.h>int prime(int n);int main()
{int m, n;scanf("%d %d", &m, &n);for (int i = m; i <= n; i++){if (prime(i)){printf("%d ", i);}}return 0;
}int prime(int n)//求素数
{if (n <= 1){return 0;}for (int j = 2; j <= sqrt(n); j++)//用sqrt(n)可以减少循环的次数,降低时间复杂度和空间复杂度{if (n % j == 0){return 0;}}return 1;
}
求素数的方法很多,那就可以多想一下,哪种算法好。下面也是一种求素数的方法,但不是这个题的解法,只不过下面的算法求素数时间复杂度和空间复杂度更低。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>void prime(int n);int main()
{int n;scanf("%d", &n);//输入上限prime(n);return 0;
}void prime(int n)
{bool* prime = (bool*)malloc((n + 1) * sizeof(bool)); // 动态分配布尔数组的内存空间// 初始化所有数为质数for (int i = 0; i <= n; ++i) {prime[i] = true;}// 开始筛法,从 2 开始到根号 nfor (int p = 2; p * p <= n; ++p) {if (prime[p] == true) {for (int i = p * p; i <= n; i += p) {prime[i] = false;}}}// 输出所有质数for (int p = 2; p <= n; ++p) {if (prime[p]) {printf("%d\n", p);}}// 释放动态分配的内存free(prime);
}