什么是素数
除了1和本身外,不再有其他的约数。
判断一个数m是否为素数,需要检查该数是否能被除1和自身以外的其他数整除,即判断m能否被2~m-1中的任何整数整除,若能被整除,则说明该数除了1和本身之外还有其他的约数,不是素数;不能整除则为素数。
设i取值2~m-1,如果m不能被该区间上的任何一个数整除,即对每个i,m%i都不为0,则m是素数;但是只要m能被该区间上的某个数整除,即只要找到一个数i,使m%i==0,则m肯定不是素数。
由于m不可能被大于m/2的数整除,所以i的取值范围可以缩小为之前的一半,即2~m/2,也可以是2~sqrt(m)
考虑到平方根的运算结果是浮点数,而浮点数是近似表示的,不能用于精确比较,为了避免由误差引起的可能错误,将i的取值区间扩大到2~sqrt(m)+1
代码实现
方法一
#include<stdio.h>
int main()
{
int i=0,count=0;
for(i=100;i<=200;i++)
{
int flag=1;//用于标记是否为素数
for(int j=2;j<=i-1;j++)
{
if(i%j==0)
{
flag=0;//不是素数
break;
}
}
if(flag==1)
{
count++;
printf("%d ",i);
}
}
printf("\n");
printf("素数总共有%d个",count);
return 0;
}
方法二
#include<stdio.h>
int main()
{
int i=0,j=0,count=0;
for(i=101;i<=200;i++)
{
for(j=2;j<=i/2;j++)
{
if(i%j==0)
{
break;
}
}
if(j>i/2)
{
count++;
printf("%d ",i);
}
}
printf("\n");
printf("素数共有%d个",count);
return 0;
}
方法三
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,count;
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("\n");
printf("素数总共有%d个",count);
return 0;
}
方法四
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0,count=0;
for (i = 101; i <= 200; i += 2)
{
int j = 0;
for (j = 2; j <= sqrt(i)+1; j++)
{
if (i % j == 0)
{
break;
}
}
if (j > sqrt(i))
{
count++;
printf("%d ", i);
}
}
printf("\n");
printf("素数总共有%d个",count);
return 0;
}
写成函数
int IsPrime(int m)
{
int i;
if(m<=1) return 0;
else if(m==2) return 1;
else
{
for(i=2;i<=sqrt(m)+1;i++)
{
if(m%i==0) break;
}
return 1;
}
}
例题使用嵌套循环求m~n之间的所有数
#include<stdio.h>
#include<math.h>
int main()
{
int count=0,i,j,flag,m,n;
printf("Enter m,n:");
scanf("%d %d",&m,&n);
if(m<1||n>500||m>n)
printf("数据无效.\n");
else
{
for(i=m;i<=n;i++)
{
if(i<=1)
flag=0;
else if(i==2)
flag=1;
else
{
flag=1;//假设i是素数
for(j=2;j<=sqrt(i)+1;j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
}
if(flag==1)
{
printf("%6d",i);
count++;
if(count%10==0)
{
printf("\n");
}
}
}
}
return 0;
}