普通法
//普通法
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j < i; j++)
{
if (i % j == 0) //试除1和它本身之间的所有数
{
break; //如果有一个除尽了,即取模为0,就跳出循环,不是素数,开始下一个数
}
}
if (j == i) //当i==j时,即代表1和它本身之间没有一个数可以除尽,则为素数
{
printf("%d ", i);
}
}
return 0;
}
普通法升级
当一个数不是素数时,可以分解成两个因数相乘,即16=4*4、16=2*8,都可以分解为一个大的因数max乘一个小的因数min,并且这两个因数任何一个都可以判断是否为素数,所以只取一个最小的因数min即可,而当取(根号16)4时,最小的数min最大,为4。所以只需使16从2取模到(根号16)4即可知道是不是为素数,即判断2-sqrt(n)之间的数就够了。
//普通法升级
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int j = 0;
int flage = 1;
int count = 0;
for (i = 101; i <= 200; i+=2) //由于偶数都不是素数,所以只算奇数
{
flage = 1;
for (j = 2; j <=sqrt(i); j++) //只判断2-sqrt(i)之间的数即可
{
if (i % j == 0)
{
flage = 0;
break;
}
}
if (flage)
{
count++;
printf("%d ", i);
}
}
printf("\n%d", count);
return 0;
}
筛选法
1不是素数也不是合数,从2开始,从小到大去掉素数的倍数,则剩下的都是素数。
//筛选法
#include<stdio.h>
int main()
{
int arr[201] = { 0 };
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i <= 200; i++)
{
arr[i] = 1;
}
for (i = 2; i <= 200; i++) //找到第一个素数
{
if (arr[i]) //该数为素数,就让该数的倍数全都去掉,
{
if (i > 100) //打印大于100的素数
{
printf("%d ", i);
count++;
}
for (j = i + i; j <= 200; j += i) //从素数的二倍开始,去掉素数的倍数。
{
arr[j] = 0;
}
}
}
printf("\n%d\n", count);
return 0;
}
筛选法升级
将从i+i开始筛选变为从i*i开始,即每个数只筛选一次。
//筛选法升级
#include<stdio.h>
int main()
{
int arr[201] = { 0 };
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i <= 200; i++)
{
arr[i] = 1;
}
for (i = 2; i <= 200; i++) //找到第一个素数
{
if (arr[i]) //该数为素数,就让该数的倍数全都去掉,
{
if (i > 100) //打印大于100的素数
{
printf("%d ", i);
count++;
}
for (j = i + i; j <= 200; j += i) //从i*i开始筛选
{
arr[j] = 0;
}
}
}
printf("\n%d\n", count);
return 0;
}