ihit's diary

ちょっとしたメモに

Project Euler 33

33番
分子と分母に共通した数字を取り除くと約分した結果と同じになる分数を探す問題

コードは下のようになったけど、正直あんまり良くない
reduce_keta関数が分母分子に共通した数字を取り除くんだけど0を含んだ数字を入れるとダメ
今回は0を含んだ数字は明らかに題意を満たさないってわかるから除外してreduce_ketaに入れることにした

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def gcm(a,b):
	if a % b == 0:
		return b
	else:
		return gcm(b,a%b)

def reduce_keta(a,b):
	bunsi = map(lambda x:int(x),list(str(a)))
	bunbo = map(lambda x:int(x),list(str(b)))
	for i in bunsi:
		if i in bunbo:
			bunsi.remove(i)
			bunbo.remove(i)
	if len(bunbo) == 1 and len(bunsi) == 1:
		new_bunsi = bunsi[0] / gcm(bunbo[0],bunsi[0])
		new_bunbo = bunbo[0] / gcm(bunbo[0],bunsi[0])
		return [new_bunsi,new_bunbo]
	else:
		return []

ans_bunsi = 1
ans_bunbo = 1
for i in range(11,99):
	if i % 10 == 0:
		continue
	for j in range(i-1,10,-1):
		if j % 10 == 0:
			continue
		if reduce_keta(j,i) == [j/gcm(j,i),i/gcm(j,i)] and j/gcm(j,i) < 10 and i/gcm(j,i) < 10:
			ans_bunsi *= reduce_keta(j,i)[0]
			ans_bunbo *= reduce_keta(j,i)[1]
print ans_bunbo/gcm(ans_bunbo,ans_bunsi)