问题:打印出100—200之间的素数,并求出个数。
素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。
方法1.试除法
#include <stdio.h>
int main()
{
int i= 0,j;
int count=0;
for(i=100;i<=200;i++)
{
for(j=2;j<i;j++)
{
if(i%j == 0)
break;
}
if(j==i)//不能被除了1和本身的数整除,是素数
{
count++;
printf("%d ",i);
}
}
printf("\n count= %d",count);
}
缺点:耗时长
优化:如果一个数i,能写成 i = a*b(a、b !=1和 i),则可以判断不是素数。而只要找到a或b的一个数能整除i,就可以确定i不是素数;一个数能写成 i = a*b(a、b !=1和 i),则a或b中至少有一个数<=,例如16=2*8=4*4,所以判断一个数是否为素数的结束点就是。
方法二:
#include <stdio.h>
#include <math.h>
int main()
{
int i= 0,j;
int count=0;
for(i=100;i<=200;i++)
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j == 0)
break;
}
if(j>sqrt(i))
{
count++;
printf("%d ",i);
}
}
printf("\ncount= %d",count);
}
还可以继续优化:偶数不能是素数。改为i+=2;
#include <stdio.h>
#include <math.h>
int main()
{
int i= 0,j;
int count=0;
for(i=101;i<=200;i+=2)
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j == 0)
break;
}
if(j>sqrt(i))
{
count++;
printf("%d ",i);
}
}
printf("\ncount= %d",count);
}
方法三:筛选法
步骤:
1.先将1去除(1不是素数)
2.用2除它后面的各个数,把能被2整除的数去除,即把2的倍数去除掉
3.用3除后面的各个数,把能被3整除的数去除,即把3的倍数去除掉
4.分别用5…作为除数除这些数后面的数
这些操作需要一个很大的容器去装载所有数的集合,只要满足这些步骤,即将大于1的且是2、3、4…的倍数全部置为0,一直到数据集合的末尾,最终不是0的数就是素数。
int main()
{
int i = 9;
int j = 0;
int arr[100];
int count = 0;
for (i = 101; i < 200; ++i)
{
arr[i] = i + 1;
}
for (i = 100; i < 200; ++i)
{
j = i - 1;//空过0、1、2
while (j>1)
{
if (arr[i] % j == 0)
arr[i] = 0;
j = j - 1;
}
}
for (j = 101; j < 200; ++j)
{
if (arr[j] != 0)
{
printf("%d是素数\n", arr[j]);
count++;
}
}
printf("%d\n", count);
return 0;
}