geo_analysisの日記

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

プロジェクトオイラー15

プロジェクトオイラーの問題15をPython3で解きました。

projecteuler.net

この問題も、問題13と同様に、Pythonではただ計算させるだけで終わります。

product = 1
for number in range(21,41):
    product *=number
divisor = 1
for number in range(1,21):
    divisor *= number
answer =int(product / divisor)
print(product)
print(divisor)
print(answer)

プロジェクトオイラー14

プロジェクトオイラーの問題14をPython3で解きました。

projecteuler.net

Collatz問題と呼ばれるもので、数学的には未解決な問題をとりあえず計算してみましょうってやつでした。

collatz_list = []
for number in range(1000000):
    collatz_number = 1
    while number > 1:
        if number % 2 == 0:
            number = int(number / 2)
        else:
            number = 3 * number + 1
        collatz_number += 1
    collatz_list.append(collatz_number)
max_chain = max(collatz_list)
print(collatz_list.index(max_chain))

プロジェクトオイラー13

プロジェクトオイラーの問題13をPython3で解きました。

projecteuler.net

Python3では桁溢れは起こらないので大きい数字同士の足し算は足せばいいだけです。

large_numbers = [int(input()) for i in range(100)]
sum_of_largge_numbers = sum(large_numbers)
string_number = str(sum_of_largge_numbers)
print(string_number[0:10])

プロジェクトオイラー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

プロジェクトオイラー11

プロジェクトオイラーの問題11をpythonで解きました。
問題

projecteuler.net

matrix = [(input()).split(' ') for i in range(20)] #行列として20×20のデータを記憶する
rows = range(20)
cols = range(20)
cells = [(row, col) for row in rows for col in cols]
for row, col in cells: #行列の各要素で10の位が0のときは0を消す
    if matrix[row][col][0] == '0':
        matrix[row][col] = matrix[row][col][1]

#行列の縦の連続した4つの要素の積のリストを作り、その中から最大値を見つける
row = 0
products_of_rows = []
while row < 17:
    for col in range(20):
        product_number = 1
        for i in range(4):
            product_number *= int(matrix[row + i][col])
        products_of_rows.append(product_number)
    row += 1
max_of_rows = max(products_of_rows)
print(products_of_rows)
#行列の横の連続した4つの要素の積のリストを作り、その中から最大値を見つける
col = 0
products_of_cols = []
while col < 17:
    for row in range(20):
        product_number = 1
        for i in range(4):
            product_number *= int(matrix[row][col + i])
        products_of_cols.append(product_number)
    col += 1
max_of_cols = max(products_of_cols)

#行列の右斜めの連続した4つの積のリストを作り、その中から最大値を見つける
products_of_rdiagonals = []
cells_up_to_17 = [(row, col) for row in range(17) for col in range(17)]
for row, col in cells_up_to_17:
    product_number = 1
    for i in range(4):
        product_number *= int(matrix[row + i][col + i])
    products_of_rdiagonals.append(product_number)
max_of_rdiagonals = max(products_of_rdiagonals)

#行列の左斜めの連続した4つの積のリストを作り、その中から最大値を見つける
products_of_ldiagonals = []
cells_up_to_17 = [(row, col) for row in range(17) for col in range(17)]
for row, col in cells_up_to_17:
    product_number = 1
    for i in range(4):
        product_number *= int(matrix[19 - row - i][col + i])
    products_of_ldiagonals.append(product_number)
max_of_ldiagonals = max(products_of_ldiagonals)

maximum = max(max_of_rows, max_of_cols, max_of_ldiagonals, max_of_rdiagonals)

プロジェクトオイラー10

プロジェクトオイラーの問題10をpythonで解きました。
問題

projecteuler.net

import math
def primes(M): #エラトステネスのふるい
    prime_true_false = [1] * M
    prime_true_false[0] = 0
    prime_true_false[1] = 0
    for number in range(2, int(math.sqrt(M)) + 1):
        if prime_true_false[number]:
            for multiple in range(number * number, M, number):
                prime_true_false[multiple] = 0
    return [prime for prime in range(2, M) if prime_true_false[prime] ]

print(sum(primes(2000000)))

プロジェクトオイラー9

プロジェクトオイラーの問題9をpythonで解きました。
問題

projecteuler.net

a_range = range(1, 1000)
b_range = range(1, 1000)
matrix = [(row, col) for row in a_range for col in b_range if row < col ]
for a, b in matrix:
    if 1000*a + 1000*b - a*b == 500000:
        print(a*b*(1000-a-b))