Pythonフォースボタンブラッシングレコード-204。素数を数える

トピック:

非負の整数n未満のすべての素数の数を数えます。
ここに写真の説明を挿入

方法1:
暴力

class Solution:
    def countPrimes(self, n: int) -> int:
        count = 0
        if n > 1:
            for i in range(2, n):
                flag = True
                for j in range(2, i):
                    if i % j == 0:
                        flag = False
                        break
                if flag:
                    count += 1
        return count

方法は簡単ですが、時間が経過し、テストに合格できません

方法2:
エラドセふるい法、力ボタンで偉大な神々が共有する方法:
たとえば、20以内の素数の数を見つけます。最初に、0と1は素数ではありません。2は最初の素数であり、次に20以内のすべての2 2の倍数を取り消します。2の直後の数字は次の素数3であり、3の倍数はすべて取り消し線が引かれます。3の直後の数字は次の素数5であり、5の倍数はすべて取り消し線が引かれます。等々。
ここに写真の説明を挿入

class Solution: 
    def countPrimes(self, n: int) -> int:
        if n < 3:
            return 0
        else:
            output = [1] * n  # 产生一个元素全部为1的列表
            output[0], output[1] = 0, 0  # 0,1不是质数,直接赋值为0
            for i in range(2, int(n**0.5)+1):  # 从2开始,output[2]==1表示第一个质数是2,然后将2的倍数对应的索引全部赋值为0,此时下一个数output[3]==1,也是表示质数,同样划去3的倍数,以此类推
                if output[i] == 1:
                    output[i*i:n:i] = [0] * len(output[i*i:n:i])
            #最后output中的数字表示该位置上的数为质数,然后求和即可
        return sum(output)

おすすめ

転載: blog.csdn.net/weixin_45455015/article/details/110605356