geo_analysisの日記

エンジニアになりたい無職のProjectEuler

プロジェクトオイラー12

プロジェクトオイラーの問題12をpythonで解きました。友人に約数の数え方を教えてもらい、助かりました。
問題

projecteuler.net

def prime_factors(N): #自然数Nの素因数分解
    factors =[]
    i = 2
    while i * i <= N:
        while N % i == 0:
            N = int(N / i)
            factors.append(i)
        i += 1
    if N > 1:
        factors.append(N)
    return factors

def prime_factors_dic(N): #自然数Nの素因数分解のディクショナリ化
    from collections import Counter
    return Counter(prime_factors(N))


def triangle_number(M): #第M番目の三角数
    return int( M*(M+1) / 2)

M = 1
while True: #三角数の約数が500以上になるまで三角数を計算し続ける
    divisors = 1
    for value in prime_factors_dic(triangle_number(M)).values():
        divisors *= (value + 1)
    if divisors >= 500:
        print(triangle_number(M))
        break
    M += 1