正文

[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   2931   37   41   43   47   53   59   61   67   7173   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   2931   37   41   43   47   53   59   61   67   7173   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;}

阅读(7951) | 评论(3)


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

评论

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