方法一:
暴力破解,缺点,速度慢
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int judge(int n)//判断一个数是不是素数
{
int count=0;
int m=sqrt(n);//只需要检查到该数的平方根即可,
for(int i=2;i<=m;i++)
{
if(n%i==0)
{
++count;
break;
}
}
if(count>0)//如果大于1,证明有2或者2以上的因子,合数
return 0;
else
return 1;
}
int main()
{
int number;//接收要判断的数
while(scanf("%d",&number)!=EOF)
{
if(number==0||number==1)
{
printf("Incorrect data!\n");
continue;
}
int t=judge(number);
if(t==1)
printf("Prime number!\n");
else
printf("Composite number!\n");
}
return 0;
}
方法1改进的地方:i++,可以写成++i。判断的时候,只要出现了有2或者以上的非本身的就可以break了,以此来减少遍历时间。
方法二:
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int judge(n)//传进来一个数,判断该数是不是素数
{
if(n<=3)
return 1;
if(n%6!=1&&n%6!=5)//不在6两侧的数一定不是素数
return 0;
int m=(int)sqrt(n);
for(int i=5;i<=m; i=i+6)
{
if (n%i==0||n%(i + 2)==0)
return 0;
}
return 1;
}
int main()
{
int number;
while(scanf("%d",&number)!=EOF)
{
int t=judge(number);
if(t==1)
printf("Prime number!\n");
else
printf("Composite number\n");
}
}
这种方法比较难想到,小于等于三的数,直接返回是素数(是没有考虑负数和0,1)的情况的,可以再加个if语句判断一下。所有的素数,都必须是6X-1或者6X+1。6x不是素数,6x+2、6x+3,6x+4都不是素数。只要6x+1或者6x+5(6x-1)有可能是素数。