用筛选法求100之内的素数

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

一.思路

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是我所能想到最好的。

        我后面学完这本书,我想试试能不能结合倍数流来优化代码。

        

        

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值