素数判断

一.判断一个数是否为素数最简单的方法是试除法

(判断一个整数a是否是素数,只需把 a 用 2 ~ a-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。)  时间复杂度O(a)

这个方法可以简化为试除2~sqrt(a)之间所有整数     时间复杂度O(sqrt(a))

完整程序(在vs2017下调试)

#include<stdio.h>
#include<math.h>
void main()
{
    unsigned long long int a,c,i,f;
    float b;
    f = 0;
    printf("input a number\n");
    scanf_s("%d", &a);
    b = sqrt(a);
    c = (floor(b)+1);
    for (i = 2; i < c; i++)
        if (a%i == 0)
        {
            f = 1;
            break;
        }
    if (f == 0)
    {
        printf("prime number\n");
    }
    else
    {
        printf("composite number\n");
    }
}

求素数的算法还可以继续优化

1.从3开始之后的所有整数仅需试除奇数    时间复杂度O(sqrt(a)/2)

#include<stdio.h>
#include<math.h>
void main()
{
    unsigned long long int a, c, i, f;
    float b;
    f = 0;
    printf("input a number\n");
    scanf_s("%d", &a);
    b = sqrt(a);
    c = (floor(b) + 1);
    for (i = 3; i < c; i=i+2) //获取2~sqrt(a)的全部奇数
        if (a%2 == 0)     //先判断2是否为该数的质因子
        {
            f = 1;
            break;
        }
        else if (a%i == 0) //再判断后续奇数是否为该数质因子
        {
            f = 1;
            break;
        }
    if (f == 0)
    {
        printf("prime number\n");
    }
    else
    {
        printf("composite number\n");
    }
}

2.易证:大于5的素数全部与6的倍数相邻(证明过程省略)时间复杂度O(sqrt(n)/3)

#include<stdio.h>
#include<math.h>
void main()
{
 int  a, c, i, f;

    f = 0;
    printf("input a number\n");
    scanf_s("%d", &a);
    if (a == 2 || a == 3)
    {
        f = 0;
    }
    if (a % 6 == 1 || a % 6 == 5)
    {
        c = (floor(sqrt(a)) + 1);
        for (i = 3; i < c; i = i + 2)
            if (a%i == 0)
            {
                f = 1;
                break;
            }
    }
    else 
    {
        f = 1;
    }
    if (f == 0)
    {
        printf("prime number\n");
    }
    else
    {
        printf("composite number\n");
    }
}

 

3.假设某数被判断为素数,那么他的所有倍数全部都是合数,这样就可以筛选掉所有已知素数的倍数

 

 

 

需要注意的是被定义变量的范围:假如使用int定义变量,有效的判断范围就是0—2147483647,超过该范围的值将无法正确判断

二.C程序设计第6章习题1:

用筛选法求100以内的素数 

(此处仍然使用了最原始的算法)

#include<stdio.h>
#include<math.h>
int main()
{
    int m, k, i;
    printf("100以内的素数\n");
    for (m = 1; m <= 100; m++)
    {
        k = sqrt(m);
        for (i = 2; i <= k; i++)
            if (m%i == 0)
                break;
        if (i >= k + 1)
        {
            printf("%d\n", m);
        }
    }
    return 0;

}

 

posted @ 2019-01-31 12:47  SALTYf1SH  阅读(273)  评论(0)    收藏  举报