C语言 判断一个是否素数

方法一:
暴力破解,缺点,速度慢
代码:

#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)有可能是素数。

猜你喜欢

转载自blog.csdn.net/weixin_44750790/article/details/91038133
今日推荐