zoukankan      html  css  js  c++  java
  • [效率算法]计算两百万以下质数的和

    这个题两段代码:第一段我自己写的,电脑差点炸了。垃圾

                               第二段网友写的,1.7s得出答案。流弊啊

    将两段代码贴在这里,供自己日后学习研究这种效率算法代码的超一流思路

    第一段

    # 电脑都快爆了,还没算出答案
    def isfrime(x):
        # if x == 2:
        #     return True
        for k in range(2,x):
            if x % k == 0:
                return False
        return True
    print(2 + sum([i for i in range(3,2000000,2) if isfrime(i)]))  

    第二段(流弊啊,愣是看了半天才懂明白是个怎样的思路)

    '''
        getPrime : (原理)
                 用的是标记法,先建一个列表,列表的项数等于要求的最大质数,内容都为True。
                然后第0,1项设为False,因为0和1都不是质数。
                从第2项开始,是2的倍数的项都是设为假,因为都不是质数。
                然后只要是列表内还没有设为假的数,从它开始,它的倍数都设为假,直到列表内全部为真的数,那就是质数。
                原理就是这样。
                利用列表的项数和列表值的对应关系。这样可以减少判断次数,当然速度就是最快的了。
    '''
    def run4(n):
            primes = [True]*n
            primes[0],primes[1]=False,False
            for (i, prime) in enumerate(primes):
                    if prime:
                            #  这一步思路最是流弊啊
                            for j in range(i*i,n,i): primes[j] = False
            return [k for (k,trueprime) in enumerate(primes) if trueprime]
    
    print (sum(run4(2000000)))
  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/Alexisbusyblog/p/10054835.html
Copyright © 2011-2022 走看看