46829


[AIZU ONLINE
JUDGE](http://judge.u-aizu.ac.jp/onlinejudge/)の0009の問題を解くために以下のようなコードを提出したのですが、「[Runtime
Error](http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3036169#1)」が出てしまいます。簡単な問題かもしれませんが原因がわかる方、お答えください。

[code]

    import math
    import sys
    
    def prime_calc(n):
        rootN = math.floor(math.sqrt(n))
        prime = [2]
        data = [i + 1 for i in range(2,n,2)]
        while True:
            p = data[0]
            if rootN <= p:
                return len(prime + data)
            prime.append(p)
            data = [e for e in data if e % p != 0]
    
    def main():
        l = []
    
        for line in sys.stdin:
            l.append(int(line))        
    
        for line in l:
            print(prime_calc(line))
    
    if __name__ == "__main__":
        main()
    
[/code]

追記:tanalab2 さんの解答のとおりにしたのですが、なぜか「[Runtime
Error](http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3036328#1)」が出てしまいます。原因は何でしょうか？

追記:tanalab2さんのご指摘の通りのコードにしました。

追記:以下の入力を試しましたが問題はありませんでした。

[code]

    10
    3
    11
    
[/code]


CC BY-SA 4.0
2018-07-17T10:16:56.460
46677
2018-07-22T09:11:37.400
2018-07-22T08:25:52.837
26886
26886
question
python python3
AIZU ONLINE ジャッジでRuntime Errorが発生した


問題を提出する前に、ご自分の開発環境で動作確認を行う必要があります。

ご質問のコードを動作確認のため実行したところ、  
以下のエラーが発生しました。

[code]

    Traceback (most recent call last):
      File "hoge4.py", line 25, in <module>
        main()
      File "hoge4.py", line 22, in main
        print(prime_calc(line))
      File "hoge4.py", line 5, in prime_calc
        rootN = math.floor(math.sqrt(n))
    TypeError: must be real number, not str
    
[/code]

標準入力から読み取った文字列を数値に変換していないことが原因と思います。

[code]

    for line in sys.stdin:
            l.append(int(line))  # 文字列を整数に変換  
    
[/code]


CC BY-SA 4.0
2018-07-17T10:38:42.583
46678
2018-07-17T10:38:42.583
46677
answer


自分で皆様が指摘した部分のソースコードを確認をしたところ、  
`1`以下のときには素数がないので`0`を返し、  
ちょうど`2`のときは素数は一つだけなので`1`を返すようにしました。  
ご回答ありがとうございました。

[code]

    import math
    import sys
    
    def prime_calc(n):
        if n <= 1:
            return 0
        elif n == 2:
            return 1
        else:
            rootN = math.floor(math.sqrt(n))
            prime = [2]
            data = [i + 1 for i in range(2,n,2)]
            while True:
                p = data[0]
                if rootN < p:
                    return len(prime + data)
                prime.append(p)
                data = [e for e in data if e % p != 0]
    
    def main():
        l = []
    
        for line in sys.stdin:
            l.append(int(line))
    
        for line in l:
            print(prime_calc(line))
    
    if __name__ == "__main__":
        main()
    
[/code]

追記:でも、今使ったアルゴリズムはAIZU ONLINE JUDGE的にはTime Limit
Exceedなので、別な（高速）のアルゴリズムを使うといいです。でも、アルゴリズムを提供してくれたFantm21さんありがとうございました。

元記事:[Pythonで作るエラトステネスのふるい](https://qiita.com/fantm21/items/5e270dce9f4f1d963c1e)


CC BY-SA 4.0
2018-07-22T08:32:11.000
46829
2018-07-22T09:11:37.400
2018-07-22T09:11:37.400
26886
26886
46677
answer