什么是素数

除了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;
}

C语言素数问题_素数

写成函数

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;
}