zoukankan      html  css  js  c++  java
  • 【筛选求质数】

    /*
    筛选求质数
    说明:
    除了自身之外,无法被其他整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家
    努力的课题,在这边介绍一个著名的Eratosthenes求质数的方法。
    
    解法:
    首先知道这个问题可以使用回圈来求解,将一个指定的数除以所有小于它的数,若可以整除就不是质数,然而如何减少回圈的检
    查次数?如何求出小于N的所有质数?
    
    首先假设要检查的数是N好了,则事实上只要检查至N的开根号就可以了,道理很简单,假设A*B=N,如果A大于N的开根号,则事实
    上在小于A之前的检查就可以先检查到B这个数就可以整除N。不过在程式中使用开根号会有精确度的问题,所以可以使用i*i<=N进
    行检查,且执行更快。
    
    再来假设有一个筛子存放1~N,例如:
    2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,……,N
    
    先将2的倍数筛去:
    2,3,5,7,9,11,13,15,17,19,21,……,N
    
    再将3的倍数筛去:
    2,3,5,7,11,13,17,19,……,N
    
    再来将5的倍数筛去,再来将7的质数筛去,再来将11的倍数筛去……,如此进行到最后留下的数都是质数,这就是Eratosthenes
    筛选方法(Eratosthenes Sieve Method) 
    
    检查的次数还可以减少,事实上,只要检查6n+1与6n+5就可以了,也就是直接跳过2与3的倍数,使得程式中的if的检查动作可以
    减少。 
    */
    
    #include <stdio.h> 
    #include <stdlib.h>
    
    #define N 1000
    
    int main(void)
    {
        int i, j;
        int prime[N+1];
        
        for(i = 2; i <= N; i++)
        {
            prime[i] = 1;
        }
        
        for(i = 2; i * i <= N; i++)
        {
            if(prime[i] == 1)
            {
                for(j = 2 * i; j <= N; j++)
                {
                    if(j % i == 0)
                    {
                        prime[j] = 0;
                    }
                }
            }
        }
        
        for(i = 2; i < N; i++)
        {
            if(prime[i] == 1)
            {
                printf("%4d", i);
                if(i % 6 == 0)
                {
                    printf("
    ");
                }
            }
        }
        
        printf("
    "); 
        
        return 0;
    }

    结果截图:

  • 相关阅读:
    python(三):python自动化测试定位
    python(二):用python抓取指定网页
    python(一):介绍网络爬虫
    oracle批量增加数据
    oracle数据库基本操作
    web安全测试要点
    linux下安装jdk、tomcat
    在linux上编译C
    linux基本操作
    对首次性能测试的总结与思考
  • 原文地址:https://www.cnblogs.com/libra-yong/p/6322060.html
Copyright © 2011-2022 走看看