2017-10-02 9 views
0

私はPythonには比較的新しく、素数をチェックする関数を構築しようとしています。なぜなら、それは良い開始プロジェクトだと思ったからです。しかし、私のコードは全てを素数として返します。私はこれを行うには非効率的な方法ですが、私は最初にそれをどうやって行うのかを理解したいと思います。ここに私のコードは、これまでのところです:素数をチェックするためのPython関数で私のロジックの欠陥は何ですか?

def Prime(n): 
    if n == 1 or n == 2 or n == 3: 
     print("This number is prime.") 
    else: 
     i = n - 1 
     while i > 0: 
      if n % i == 0: 
       break 
       print("This number is not prime.") 
      else: 
       i = i - 1 
      print("This number is prime.") 

def Main(): 
    n = int(input("What is the number you'd like to check?")) 
    Prime(n) 
    answer2 = input("Thank you for using the prime program.") 

Main() 
+0

もう1つの変更は、 'i = n - 1'を' i = n ** 0.5 + 1'に変更することです。 – boardrider

答えて

0

はカップルの変更であなたのプログラムは以下のとおりです。

def Prime(n): 
    if n == 1 or n == 2 or n == 3: 
     print("This number is prime.") 
    else: 
     i = n - 1 
     while i > 1: 
      if n % i == 0: 
       print("This number is not prime.") 
       return 
      i = i - 1 
     print("This number is prime.") 
     return 

def Main(): 
    n = int(input("What is the number you'd like to check? ")) 
    Prime(n) 
    print "Thank you for using the prime program." 

Main() 

最初に、iは、すべての数値が1で割り切れるので0よりもi > 1まで比較されるため、元の条件が使用されていればすべての数値が素数になります。

第2に、breakステートメントはreturnに置き換えられます。 breakは機能しますが、プログラムでは、素数のメッセージが常に末尾に表示されるため(プライムメッセージではなく)、さらに多くの変更が必要になります。また、returnステートメントは、印刷後実際に印刷物を得るために移動されました。さらに重要なのは、数字がプライムであるというメッセージがwhileの外に移動したことです。そうしないと、すべての繰り返しでメッセージが出力されます。

elseも削除しました。また、whileというループでは、わかりやすい代替手段として、iがデクリメントされています。

最後に、あなたの最後のステートメントは、出力であると仮定していました。私はまた、メッセージがよりうまく表示されるようにメッセージを表示するスペースを追加しました。

0

これは、論理上の欠陥を説明するのは容易ではないのですが、あなたは以下のコードを見ることができます。ここ

def Prime(n): 
    if n == 1 or n == 2 or n == 3: 
     print("This number is prime.") 
    else: 
     i = n - 1 
     while i > 0: 
      if i == 1 or n == 2 or n == 3: 
       print("This number is prime.") 
       break 
      if n % i == 0: 
       print("This number is not prime.") 
       break 
      else: 
       i = i - 1 

def Main(): 
    n = int(input("What is the number you'd like to check? ")) 
    Prime(n) 
    print("Thank you for using the prime program.") 

Main() 
1

数学的には、あなたは数が素数であるか、ロジック用として、あなたが扱う負の数に加えて、私の次のコードを参照してください。他のものが欠落しているわけではない判断する(n)は0とsqrtの間だけ、すべてのintをチェックすることができ話す:

def prime(n): 
    n = abs(n) 
    if n<4: return True 
    i = int(sqrt(n)) 
    while i > 1: 
     if n % i == 0: return False 
     i -= 1 
    return True 

プラスあなたはあなたのコードが印刷されることはありません、最初のオフ、

from math import sqrt 
+0

機能内の印刷が繰り返され、そのような動作は望ましくありません。ブール値を返し、正しいメッセージを表示する理由を調べる –

0

[OK]をクリックしてインポートにこれを追加する必要があります「この数字が素数ではありません。」その直前にbreakステートメントを置いているからです。あなたはそれがなるように、これらの2行を逆にしたいと思う:あなたはそれよりも、単に数字が小さい方にも開始番号を確認し、ないよう

また
print("This number is not prime.") 
break 

、ラインi = n - 1i = nに変更する必要があります。だから今コードを試してみると、入力値だけではなく、チェックしたすべての数値が素数であるかどうかにかかわらず、印刷していることに気付くでしょう。コード構造を使用してこれを修正するには、フラグを使用します。例:

def Prime(n): 
    flag = true 
    if n == 1 or n == 2 or n == 3: 
     print("This number is prime.") 
    else: 
     i = n 
     while i > 0: 
      if n % i == 0: 
       print("This number is not prime.") 
       break 
      else: 
       i = i - 1 
     if flag == true: 
      print("This number is prime.") 

フラグチェックはループ外にある必要があります。

関連する問題