0
x = y // 2  # For some y > 1
while x > 1:
   if y % x == 0: # Remainder 
      print(y, 'has factor', x) 
      break  # Skip else
   x -= 1 
else: # Normal exit
   print(y, 'is prime')

これは、私が読んでいる本のwhileループを理解するための例ですが、なぜ床分割してからy%xなのか、よくわかりません。誰かがこのコードを説明してもらえますか、それは何をしているのですか?

ありがとう!

4

8 に答える 8

4

これは素数判定のラメです。

%はモジュロ演算子です。除算を実行し、除算の結果ではなく余りを返します。たとえば、5 // 2 == 2、および5%2==1です。

コメント:

x = y // 2  # For some y > 1  ##Reduce search space to half of y
while x > 1:
  if y % x == 0: # Remainder  ##If x divides y cleanly (4 / 2 == 2)
    print(y, 'has factor', x) ##y is not prime
    break  # Skip else        ##Exit the loop
  x -= 1   # Normal exit  ##Try the next value
else:
  print(y, 'is prime')
于 2009-12-09T07:54:59.460 に答える
1

ロジックは次のとおりです。

xを法とするyが0の場合、xがyの除算器であることを意味するため、yには係数があります。それを印刷して、ループから抜け出します。

そうでない場合は、xを1減らして、再試行してください。

しかし、このコードではいくつかのことが壊れています:

  1. elseステートメントの位置
  2. 'print yisprime'という事実はループの後にあります-それは常にそれを印刷します。
于 2009-12-09T07:55:07.213 に答える
1

プログラムは、整数yの少なくとも1つの因数を出力します。または、因数がない場合(それ自体と1以外)、yが素数であることを出力します。

変数xを使用して、1より大きいすべての可能な因子を試します。yの半分よりも大きい数は要因になり得ないため、yのフロアを2で割ったところから始まります。yが奇数の場合、フロア分割ではなく通常の分割を使用すると、小数値が得られる可能性があります。(さらに良い解決策は、yの平方根から始めることです。yが素数でない場合、その因子の1つはその平方根以下になります。)

ループ内では、yをxで割った後の余りであるy%xをテストします。余りがゼロの場合、それはxがyの因数であることを意味し、それを出力します。

else節は、因子が見つからない限り、ループの最後で実行されます。因子が見つからない場合、「break」はループとelse節をスキップします。したがって、要因が見つかるか、それが素数です。

インデントが修正された改善されたコードは次のとおりです。

import math

def check_primality(y):
  x = int(math.sqrt(y))
  while x > 1:
    if y % x == 0:                                                
      print y, 'has factor', x
      break
    x -= 1
  else:
    print y, 'is prime'
于 2009-12-09T07:59:36.447 に答える
1

コードは、xの平方根に到達したかどうかをチェックするだけです。2からxの平方根までの整数がxを完全に(余りなしで)除算するかどうかをチェックすることで、数値の素数性をチェックできることに注意してください。

于 2009-12-09T07:59:44.153 に答える
1

素数ではない任意の数(x)の場合、1より大きく(x / 2)より小さい係数があります。9 = 3 * 3ロジックは、すべての数値<= x / 2を反復処理し、数値が除算されるかどうかを確認することです。

于 2009-12-09T08:09:43.813 に答える
0

プログラムはyの最大の素因数を見つけようとしていると思います。yが素因数の場合、これも出力されます。

于 2009-12-09T07:55:19.850 に答える
0

x = y // 2x:の範囲の数値をテストするためのものです2..y/2
より良いアプローチは、数値xのみをテストすることです。2..sqrt(y)

于 2009-12-09T07:57:32.873 に答える
0

%は、除算の余りを与えるモジュラスを示します。

このコードはプライムYをチェックし、Yがxの乗数であるかどうかもチェックします。

x = y // 2#x = yの除算または係数、2

x> 1:#これが除算の結果なのかモジュラスなのかを確認したい

yの場合%x == 0:#yがxの乗数の場合

  print(y, 'has factor', x) 

  break  # break the while loop

x -= 1 # decreament x 

else:#この行は、wihleがx> 1に到達し、print(y、'isprime')を壊さなかった場合に実行されます。

したがって、yがxの乗数である場合、xはデクリーメントされ、ループが続行されます。それ以外の場合は、yが素数であると出力されます。

于 2009-12-09T08:04:36.670 に答える