1

私は、単一の先頭の整数と任意の数の末尾のゼロを持つ数値を取り、2 つの因数のすべての可能な組み合わせを出力するプログラムを作成しようとしています。

すなわち。

100

係数は 2^2、5^2

したがって、プログラムは次のように出力します。

(2,50)、(4,25)、(5,20)

また

600

因数は 2^3,3,5^2

(2,300)、(4,150)、(8,75)、(3,200)、(5,120)、(25,24)、(6,100)、(12,50)、(15,40)、(30,20)、 (60,10)

……これで全部かな?それは...ですか?プログラムを使用してチェックすることができます...

import itertools

facts=[[2,2,2],[3],[5,5]]
for n in itertools.product(*facts)
    print(n)

私はこれを間違って使用していることがわかりますが、それが私の最初の刺し傷でした.

これは (2,3,5) を 10 回だけ与えます。

(2) * (2,3,5,5) や (2,2) * (3,5.5) などのようなものが欲しい...

4

4 に答える 4

2

素因数を与えられた数のすべての因数を生成するには

#!/usr/bin/env python
import itertools, operator

def all_factors(prime_dict):
    series = [[p**e for e in range(maxe+1)] for p, maxe in prime_dict.items()]
    for multipliers in itertools.product(*series):
        yield reduce(operator.mul, multipliers)

prime_dict = {2:3, 3:1, 5:2}
L = sorted(all_factors(prime_dict))
number_of_divisors = reduce(lambda prod, e: prod*(e+1), prime_dict.values(),1)
assert len(L) == number_of_divisors
# -> [1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24,
#     25, 30, 40, 50, 60, 75, 100, 120, 150, 200, 300, 600]

ペアを作成するには:

n, isodd = divmod(len(L), 2)
print(zip(L[:n], reversed(L[n + isodd:])))
if isodd: # number is perfect square
   print((L[n], L[n]))

出力

[(1, 600), (2, 300), (3, 200), (4, 150), (5, 120), (6, 100),
 (8, 75), (10, 60), (12, 50), (15, 40), (20, 30), (24, 25)]

少数の場合に機能します。これを使用して、番号の特殊な形式を考慮に入れることができるソリューションをテストできます。x00000...

于 2012-08-14T04:44:43.227 に答える
2

これが私がそれを行う方法です:

def factors(n):
  # Fill this in

def factor_pairs(n):
  for i in factors(n):  # You need to write the factor() function
    yield i, n / i

if __name__ == '__main__':
  n = input('Enter an integer: ')

  for i, j in factor_pairs(n):
    print i, j

完全にコーディングするつもりはありませんが、アイデアは理解できます。

于 2012-08-14T04:08:53.890 に答える
0

あなたはそれをすべてリスト内包に入れることができます

import math
n = 600 # or whatever...
[(x, n/x) for x in range(1, int(math.sqrt(n))+1) if n % x == 0]

戻り値:

[(1, 600), (2, 300), (3, 200), (4, 150), (5, 120), (6, 100), (8, 75), (10, 60), (12, 50), (15, 40), (20, 30), (24, 25)]

(1,600)が必要ない場合は、range(2、int(math.sqrt(n))+ 1)を使用してください。

于 2012-08-14T04:26:24.883 に答える
0

私はこれがあなたが望むことをすると思います:

n = input('Enter a number? ')
factors = []

for i in range(int(sqrt(n))):
  if n % i == 0:
    factors.append((i, n / i))

因子の定義上、確認しなければならない最大数はその数の平方根までなので、これをコーディングできれば設定されているはずです。

これをコーディングできる場合は、設定する必要があります。

于 2012-08-14T04:11:29.780 に答える