2016-06-26 4 views
2

私はプログラミングに慣れていないし、if文を使ってforループ、nested forループを学習しようとしています。Python 3.5.1で整数のすべての因数分解を出力するには

iは整数nの全てfactorisationsを生成するために、このコードを書かれている:

n=int(input()) 
for i in range(0,n+1): 
    for j in range(0,i): 
     if i*j == n: 
      print(i,'times',j,'equals',n) 
      break 

は今、N = 10、それは次の結果を生成する場合:

5回2 10
10に等しいです時間1は10に等しい

これはいくつかの問題です。まず、それは

1回10すなわち最初の因数分解を無視し、私はそれを言うべき、つまりijが結果に交換することにしたい10

第二の問題点に等しいことである:

1回10は10と等しい
2回5が等しい1
10回1は1

ない

1回10 10
5回2に等しく、ここで10

+0

第一の要因を発見した際に、ご希望の出力はそれに「5回2が10に等しい」はありません。何か特別な理由? – user2357112

答えて

1
for i in range(0,n+1): 
    for j in range(0,i): 

jに等しい1~10
10倍に等しい意味し、範囲(0,i)でありますi1であるとき、jは、0からもちろん、それらの製品は、n10のときnではありません。

修正は簡単です:

for i in range(0,n+1): 
    for j in range(0,n+1): 

しかし、このアルゴリズムは、大きなnのためにかなり遅いです。 jを繰り返し実行する必要はありません。i * j == nの場合は、jn/iと計算し、整数であればテストします。

因子がペアになっていることを考慮すると、nの代わりに、inの平方根に反復するだけです。

+1

これはあなたの助言の後に書いたコードです。明らかに働いています。 0%: print(i、 'times'、str(int(n // i))の場合、 は範囲(1、n + 1)のiに対して を返します。 )、 'equals'、n) ' – excobra

0

この試してみてください:あなたはbreak文を必要としないかもしれないあなたがすべての要因

  • を持つようにしたい場合も、重複
  • があるかもしれません

    • n = int(input()) 
      for i in range(1, int(n/2) + 1): 
          for j in range(1, i): 
           if i * j == n: 
            print(j, ' times ', i, ' equals ' , n) 
      

      少数の観測を

    • あなたは1からループを開始することがあります
    • あなたはy n/2がnより小さい最大の要素であるため、最初のループをn/2に制限する

    このコードはコピー・ペースト・ソリューションではなく、出発点としてご利用ください。

    0

    私はあなたが最小限のループ数を使用し、コードの効率に焦点を当てることを提案したいと思います。たとえば、あなたは次のように行うことができます。

    from math import sqrt #this imports square root from math 
    
    n=int(input()) 
    for i in range(1,int(sqrt(n))+1): # this will help in less number of iterations 
        if n%i==0: #checks if n is properly divisible by i or not! 
         j=n/i # if yes then i,j are the factors of n 
    

    あなたは今、すべての要因を印刷したり、break文を使用することができます

    関連する問題