正文

[031] 判断m是否是素数2006-03-10 22:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/10896.html

分享到:

<谭> 6.8 判断m是否是素数

    采用如下算法:让m被2到m^2除,如果m能被2~m^2之中任何一个整数整除,则提前结束循环,此时i必然小于或等于k(即m^2);如果m不能被2~k(即m^2)之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。

#include <stdio.h>
#include <math.h>
int main()
{
    int m, i, k;
    scanf("%d", &m);
    k = sqrt(m);

    for (i = 2; i <= k; i++)
        if (m % i == 0) break;

    if (i >= k + 1)
        printf("%d is a prime number\n", m);
    else
        printf("%d is not a prime number\n", m);

    return 0;
}

素数: 大于1,并且除1和它本身外没有其他因数的自然数叫素数(或质数) ,2是最小的素数,除2以外,所有的偶数都不是素数。



6.9 求100~200间的全部素数。

#include <stdio.h>
#include <math.h>
int main()
{
    int m, i, k, n = 0;
    for (m = 101; m <= 200; m = m + 2/* 除2以外,所有偶数都不是素数 */
    {
        k = sqrt(m);

        for (i = 2; i <= k; i++)
            if (m % i == 0) break;

        if (i >= k + 1)
        {
            printf("%d ", m);
            n = n + 1;
        }
        if (n % 10 == 0)
            printf("\n");
    }
    printf("\n");
    return 0;
}

用筛选法也可以做, 下章数组再续。


一个自然数是素数,且它的各位数字位置经过任意对换后仍为素数,则称是绝对素数

[更新] 2006.11.18  [066] 筛选法求素数


[更新] 2006.11.19

今天按如上方案写了个判断素数的函数, 用其求1到100间的素数如下:

#include <stdio.h>
#include <math.h>

int prime(int n)
{
    int i;
    int k = sqrt(n);

    if(n > 1)
    {
        for(i = 2; i <= k; i++)
            if(n % i == 0)
                break;
       
        if(i >= k + 1)
            return 1;
        else
            return 0;
    }
    else
        return 0;
}

int main(void)
{
    int i;
    int n = 0;
    int a[101];

    for(i = 1; i <= 100; i++)
    {
        if(prime(i))
        {
            printf("%-5d", i);
            n++;
        }
        if(n == 10)
        {
            printf("\n");
            n = 0;
        }
    }
    printf("\n");
    return 0;
}

运行结果(VC)
=================================================
2    3    5    7    11   13   17   19   23   29
31   37   41   43   47   53   59   61   67   71
73   79   83   89   97
=================================================


[更新] 2006.12.27

今天又在一本书上看到一个判断素数的函数,虽然没对理论的上限值作约束,但看上去比上面的方法要简洁些。因为2是最小的素数,所以此函数是从2开始运行的,没有对1进行判断处理,这样就要求实参要大于等于2,求1到100以内的素数时就要从2开始做循环了,用此函数求1到100间素数如下:

#include <stdio.h>
#include <math.h>

int prime(int n)
{
    int i;
    for(i = 2; n%i != 0; i++)
        ;
    return n == i ? 1 : 0;
}

int main(void)
{
    int i;
    int n = 0;
    int a[101];

    for(i = 2; i <= 100; i++)
    {
        if(prime(i))
        {
            printf("%-5d", i);
            n++;
        }
        if(n == 10)
        {
            printf("\n");
            n = 0;
        }
    }
    printf("\n");
    return 0;
}

运行结果(VC):
=================================================
2    3    5    7    11   13   17   19   23   29
31   37   41   43   47   53   59   61   67   71
73   79   83   89   97
=================================================

用受此函数的启发,函数返回值用的 return n == i ? 1 : 0; 很简洁,这种返回值为真或假的函数真就该这么用,而我原来那种用if--else判断的结构相比之下显得有些繁,因此将上面2006.11.19更新中的判断素数函数改写了一下,虽然还是用了两个return 但比原来的看上去要好一些,如下:

int prime(int n)
{
    int i;
    int k = sqrt(n);
    if(n > 1)
    {
        for(i = 2; i <= k; i++)
            if(n % i == 0)
                break;       
        return (i >= k + 1) ? 1 : 0;
    }
    else
        return 0;
}



阅读(7797) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册