找质数的方式

在很多编程题中,可能需要找出小于N的质数,一般的枚举算法是比较费时的(比如遍历小于$\sqrt{n}$的所有数,判读其是否是n的因子),这里介绍一种更为高效的算法:埃氏筛

步骤如下:

  • 使用长度为 n 的数组 is_prime 来判断一个数是否是质数。如果 is_prime[i] == True ,则表示 i 是质数,如果 is_prime[i] == False,则表示 i 不是质数。并使用变量 count 标记质数个数。
  • 然后从 [2,n−1] 的第一个质数(即数字 2) 开始,令 count 加 1,并将该质数在 [2,n−1] 范围内所有倍数(即 4、6、8、...)都标记为非质数。
  • 然后根据数组 is_prime 中的信息,找到下一个没有标记为非质数的质数
  • 以此类推,直到所有小于或等于 n−1 的质数和质数的倍数都标记完毕时,输出 count
  • 优化:对于一个质数 y,我们可以直接从 y×y 开始标记,这是因为 2×y、3×y、… 这些数已经在 y 之前就被其他数的倍数标记过了,例如 2 的所有倍数、3 的所有倍数等等。
    class Solution:
        def countPrimes(self, n: int) -> int:
            is_prime = [True] * n
            count = 0
            for i in range(2, n):
                if is_prime[i]:
                    count += 1
                    for j in range(i * i, n, i):
                        is_prime[j] = False
            return count
    

好的,这个问题可以回答。 以下是使用数组方式1000内的素数的Python代码: ```python # 创建一个长度为1000的数组,初始值都为True prime = [True] * 1000 # 数值1不是素数,将其赋值为False prime[0] = False # 使用埃氏筛法,将1000内的素数筛选出来 for i in range(2, 1000): if prime[i-1]: # 将i的倍数赋值为False for j in range(i*2, 1001, i): prime[j-1] = False # 输出1000内的素数 for i in range(1000): if prime[i]: print(i+1, end=" ") ``` 运行结果: ``` 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 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997 ``` 以上代码使用了埃氏筛法(Sieve of Eratosthenes)来筛选1000内的素数。首先创建一个长度为1000的数组,初始值都为True,然后将数值1赋值为False。接着从2开始,如果当前数是素数,则将其倍数赋值为False。最后遍历数组,输出值为True的索引值加1,即为1000内的素数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值