前提・実現したいこと
素数判定プログラムを作る
Python で素数判定プログラムを以下のように作りました。
発生している問題・エラーメッセージ
9や21,49は素数でないのにもかかわらず、True と表示されてしまいます。
いろいろ調べてみましたが、どこに問題があるのかわかりません。
改善すべきところを教えてください。
また、この is_prime 関数を用いて、n 以下の素数を数えるプログラムはどうやればいいでしょうか。
合わせて教えていただけると幸いです。
該当のソースコード
def is_prime(n):
if n == 1:
return False
if n == 2:
return True
for k in range(2, int((n ** 0.5)+ 1)):
if n % k == 0:
return False
else:
return True
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
再起処理で実装しないと無理かと。
というかfor文が一回回った時点で処理が終了しています。どこが悪いかとかそういうレベルではありません。すべて悪いです。
投稿2020/09/30 09:55
総合スコア79
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/30 10:03
2020/09/30 10:06
2020/09/30 10:43 編集
2020/09/30 10:56 編集
2020/09/30 11:16
2020/09/30 11:22
2020/09/30 11:28
2020/09/30 11:30
2020/09/30 11:35
2020/09/30 11:41
2020/09/30 11:46
0
3 つの方法を書いてみました。
p.py
pythn3
1import math 2 3def is_prime(n): 4 if n < 2: 5 return False 6 if n == 2: 7 return True 8 9 for k in range(2, int(math.sqrt(n) + 1)): 10 if n % k == 0: 11 return False 12 return True 13 14def is_prime_2(n): 15 return not (n < 2 or any(n % x == 0 for x in range(2, int(n ** 0.5) + 1))) 16 17def primes_upto(limit): 18 is_prime = [False] * 2 + [True] * (limit - 1) 19 for n in range(int(limit**0.5 + 1.5)): # stop at ``sqrt(limit)`` 20 if is_prime[n]: 21 for i in range(n*n, limit+1, n): 22 is_prime[i] = False 23 return [i for i, prime in enumerate(is_prime) if prime] 24 25MAX = 100 26for x in range(1, MAX + 1): 27 if is_prime(x): 28 print(x, end=" ") 29print("") 30 31for x in range(1, MAX + 1): 32 if is_prime_2(x): 33 print(x, end=" ") 34print("") 35 36for x in primes_upto(MAX): 37 print(x, end=" ") 38print("")
参考情報;
- Primality by trial division
https://rosettacode.org/wiki/Primality_by_trial_division#Python
- Sieve of Eratosthenes
https://rosettacode.org/wiki/Sieve_of_Eratosthenes#Python
- 素数の一覧
https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0%E3%81%AE%E4%B8%80%E8%A6%A7
投稿2020/10/07 22:31
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
- 関数定義の末尾の「:」が全角で書いてある
- 試し割は、すべてのkについて割り切れなかったときだけTrue、ひとつでも割り切れる値があればFalse
Python
1def is_prime(n): 2 if n == 1: 3 return False 4 if n == 2: 5 return True 6 for k in range(2, int((n ** 0.5) + 1)): 7 if n % k == 0: 8 return False 9 return True 10 11 12for i in range(1, 20): 13 if (is_prime(i)): 14 print(i, end=", ") 15print()
result
12, 3, 5, 7, 11, 13, 17, 19,
投稿2020/09/30 10:13
編集2020/09/30 10:15総合スコア11990
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。