题目概述:
1. 请实现一个函数,对于给定的整型参数 n,该函数能够把自然数中, 小于 n 的质数/素数, 从小到大 打印出来。
示例:
输入:n = 10
输出:2 3 5 7
2.请实现一个函数,对于给定的整型参数 n,该函数能够 从小到大 ,依次打印出自然数中 最小 的 n 个质数/素数。
示例:
输入:n = 10
输出:2 3 5 7 11 13 17 19 23 29
提示:
- 素数指在正整数范围内,大于1且只能被1和自身整除的数
- 采用多种方式求解,尽可能优化算法
- 1 < n <= 1000
解题思路:
求素数是基本上每个刚接触编程的小白都可能面对的一道经典题,其资历也可以算一位老精英怪了,以至于许多人都会拿其来练练手,当然我也是。刚好下午刷博客的时候看了一篇《素数求解的n种境界》,感觉有些“吃撑了”,正好用自己的理解也尝试打打这位资深精英怪来“消消食”。
素数求解我目前能想到的方法就两种:试除法与筛除法。
方法①:试除法
试除法是基本绝大多数人都能想到的一种方法,当然我也是第一时间先想到了这个。
简单来说就是从2开始不断对小于该数的数字取模(求余),若余数一直到试除完所有正整数都不为0,则为质数/素数,并打印输出。因此可以写出代码如下:
// 题1:输入正整数n,求n以内的素数
int count, n;
printf("请输入正整数n:");
scanf("%d", &n);
printf("%d以内的质数有:2 ", n);
count = 1; // 计入最小素数2
for (int i = 3; i <= n; i++) {
int j = 0;
for (j = 2; j < i; j++) {
if (i % j == 0)
break;
}
if (j == i){
printf("%d ", i);
count++;
}
}
printf("\n共%d个",count);
// 题2:输入正整数n,求n个最小素数
int count, n;
printf("请输入正整数n:");
scanf("%