C语言 素数三种思路求解

#include
#include
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);

}

你可能感兴趣的:(【c/c++】)