C语言 素数三种思路求解

#include<stdio.h>
#include<math.h>
void main()
{
		//一既不是素数也不是偶数、2是素数
		//常规思路
		//int i, j,n;
		//for (j = 3; j <= n; j++)
		//{
		//	for (i = 2; i <= j - 1; i++)
		//		if (j%i == 0)   
		//			break;  //有整除就说明不是素数
		//	//i==n,表明是素数
		//}
	



		//开根号
		//int i, j, n;
		//printf("enter the n:\n");
		//scanf("%d", &n);
		//for (i = 3; i < n; i++)
		//{
		//	for (j = 2; j <= sqrt((double)i); j++)
		//		if (i%j == 0)
		//			break;
		//}
	
	
	
	/*素数筛选法*/
	/*
	我们知道要求某一区间内的素数,只需要将这一区间内的合数去除,即筛除即可,这种办法利用的就是这种思想。
	例如:2,3,4,5,6,7,8,9,10,11,12,13,14,15.......
	第一遍筛掉2的倍数:剩下2,3,5,7,9,11,13,15.....
	第二遍筛掉3的倍数:剩下2,3,5,7,11,13,....
	第三遍筛掉5的倍数:(为什么是5而不是4,因为4已经被2的倍数筛掉了,再筛已经无意义)
	第四遍筛掉7的倍数:(为什么是7而不是6,同理因为6已经被之前的2,3筛掉了再筛也没有意义了)
	。。。。。。。。。。。
	//千万不要就是只要不是2357的倍数就是素数。思路是错误的,比如899=31*29,要是按2357就完全是错误的
	//for (i = 2; i < 1000; i++)
	//	if (a[i] % 2 == 0)
	//		a[i] = 0;

	//for (i = 3; i < 1000; i++)
	//	if (a[i] % 3 == 0)
	//		a[i] = 0;

	//for (i = 5; i < 1000; i++)
	//	if (a[i] % 5 == 0)
	//		a[i] = 0;

	//for (i = 7; i < 1000; i++)
	//	if (a[i] % 7 == 0)
	//		a[i] = 0;
	*/
	int count = 0;
	int a[1000];
	int i, j;
	a[0] = 0;
	a[1] = 0;
	//初始化
	for (i = 2; i < 1000; i++)
		a[i] = i;
	//核心过程 sqrt((double)1000)也是借鉴了开根号的思想。
	for (i = 2; i < sqrt((double)1000); i++)
		if ((a[i] != 0))
		{
			for (j = 2 * i; j < 1000; j += i)
				a[j] = 0;
		}

	//输出结果
	for (i = 2; i < 1000; i++)
		if (a[i]){
			printf("%d\t", a[i]);
			count++;
		}
	printf("%d\t", count);

}

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值