#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);
}
C语言 素数三种思路求解
最新推荐文章于 2024-08-04 10:24:08 发布