一.思路
1. 先定义一个一维整型数组,数组名为a,数组大小为100;
2. 使用for循环将1~100赋值到a[0]~a[99]中;
3. 筛选素数:
- 素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
1. 根据素数定义,1不是素数。
2. 从自然数2开始筛选,即从数组元素a[1]开始遍历数组。for (int i = 1; i < 100; i++)。(将不是素数的标记为0)
3. 根据素数定义“除了1和它本身以外不再有其他因数”,从2~7作为整除数开始循环整除
1. 判断a[i]是否会被2~7的自然数整除,即if (a[i] % j == 0)
1. 如果会被整除(从自然数2开始),再a[i]是否等于它本身,即if (a[i] == j)
1. 如果a[i]等于它本身,则执行break语句结束内循环,进行下一个外循环;
2. 否则,标记a[i] = 0,然后执行break语句结束内循环,进行下一个外循环。
2. 如果不会被2整除 ,下一个内循环,即是否会被3整除...
2. 否则,i++,继续下一个外循环。
4. 输出2~100以内标记不等于0的数。
二.代码
#include<stdio.h>
#include<stdlib.h>
/*
用筛选法求100以内的素数。
*/
int main()
{
// 1.定义一个整型数组,数组大小为100
int a[100];
// 2.将1到100的自然数赋值到a数组中
for (int i = 0; i < 100; i++)
{
a[i] = i + 1;
}
// 3.2 筛选素数,将不是素数的标记为0,1不是素数,从2开始,即从a[1]开始
for (int i = 1; i < 100; i++)
{
// 对a[i]进行2~7整除
for (int j = 2; j <= 7; j++)
{
if (a[i] % j == 0)
{
if (a[i] == j)
break;
else
{
a[i] = 0;
break;
}
}
}
}
// 4.输出
printf("Prime numbers up to 100 are found by screening:\n");
for (int i = 1,k = 0; i < 100; i++)
{
if (a[i] != 0)
{
printf("%4d", a[i]);
k++;
}
// 每输出10个元素,换行
if (k % 10 == 0)
printf("\n");
}
printf("\n");
system("pause");
return 0;
}
三.输出结果示意图

四. 注意
1. a[i]并不是要和(2,3,4,5,6,7)这6个自然数都进行整除操作。以当a[2] = 3,a[4] = 5为例说明:
1. 当a[i] = 3时,依据素数定义,3需要和自然数(2,3)发生整除操作:
- 3 % 2 != 0
- 3 % 3 == 0,此时根据定义,此时应该break语句,进行下一个数的判断。
2. 当a[i] = 5时,依据素数定义,5需要和自然数(2,3,4,5)发生整除操作:
- 5 % 2 != 0
- 5 % 3 != 0
- 5 % 4 != 0
- 5 % 5 == 0,此时根据定义,此时应该break语句,进行下一个数的判断。
- 如果此时只有它本身(当a[i] == 5时)才满足“整除结果为0”的操作,它本身就作为一个结束循环 标记数。即此时就不用进行后面的(6,7)整除判断。
2. 只让2~7作为整除数开始循环整除。
- 因子中又有其因子。
- 2的倍数。例如4的因子有2,4 % 2 == 0时,得到了因子2,就不用再判断4是否是其因子。
- 3的倍数。例如9...。
- 5的倍数。例如10...
- 7的倍数。
五.总结
自己也刚大学毕业没多久,以前大四以前代码都是看csdn的,不过大多看不懂。也怪自己手机玩多了。
看了一下其他人的文章,前几篇文章都解释筛选法就是“将合数标记为0,然后输出不是0的数就是素数”。用的是“倍数法”,即将同倍数的标记为0.从倍数2开始,将4,6,8,...,100后标记为0;从3开始,将6,9...,99标记为0......
倍数法的思路给我感觉是不错的,不过那些代码有点不明显。比如,部分数字会进行重复判断,应该在if语句加上当遇到已经标记为0的数应该跳过,减少判断次数。
我可能会在意“一目了然”以及“时间和空间”。一看就懂的代码,我还是很喜欢的。如果它用到的循环+判断的次数更少的话,可能就更好了。上面的思路其实是根据素数定义的,以及常规思路(该自然数和除1和它本身的数比较),其中优化了整除对象数,2~7是我所能想到最好的。
我后面学完这本书,我想试试能不能结合倍数流来优化代码。

本文详细描述了如何使用C语言通过筛选法找出100以内的素数,并展示了代码实现过程。作者提到优化了整除操作,仅考虑2~7作为因子,同时指出可以进一步优化代码以提高效率,注重代码的可读性和效率平衡。
7041






