筛选法求n以内的素数(算法过程解析)

目录

 题目:

思路:

源码:

为什么0、1下标不用?


 题目:


思路:

一、利用循环将2~n以内的正整数存入数组中,从下标2开始存,0、1下标不存数据,初始值为0。

二、用内外层循环进行筛选,外层循环遍历2~n的数,内层循环遍历外层循环数的2倍的所有的数,依次将所外层循环数的所有倍数值设置为0,设置变量计算为0的个数。

三、二步骤完成后,再次遍历数组,将 不为0的数即素数还有count打印输出。


源码:

int main()
{
	int n;
	int arr[101];
	while (scanf("%d", &n) != EOF)
	{
		//输入数据
		for (int i = 2; i <= n; i++)
		{
			arr[i] = i;
		}
		//筛选数据
		int count = 0;
        //外层循环
		for (int i = 2; i <= n; i++)
		{
			if (arr[i] != 0)
			{
                //内层循环
				for (int j = 2 * i; j <= n; j += i)
				{
					if (arr[j] != 0)
					{
						arr[j] = 0;
						count++;
					}
				}
			}
		}
		//输出数据
		for (int i = 2; i <= n; i++)
		{
			if (arr[i] != 0)
			{
				printf("%d ", arr[i]);
			}
		}
		printf("\n");
		printf("%d", count);
	}
}

为什么0、1下标不用?

1、从下标2开始存入数据时,下标即为存入数组的数据,如arr[2]=2,arr[3]=3,便于理解筛选过程。

2、循环条件i<=n直接对应数值范围2~n,无需处理0和1的特殊情况。

3、数组101仅限制两个空间(0,1下标),空间成本极低,却换来了代码的简洁性和可读性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值