ihit's diary

ちょっとしたメモに

Project Euler 20, 21

前々から少しずつ解いてきたProject Euler(https://projecteuler.net/)の自分なりの解答をここに残しておく。

20番
100の階乗の各桁の和を求める問題

#!/usr/bin/env python
# -*- coding: utf-8 -*-
ans = [1]
for i in range(1,101):
	C = 0
	for j in range(0,len(ans)):
		ans[j] = ans[j] * i + C
		C = ans[j] / 10
		ans[j] = ans[j] % 10
	while C > 0:
		ans.append(C%10)
		C = C / 10
print sum(ans)

21番
10000未満の友愛数の和を求める問題

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def yakusu(num):
	row_num = num
	yakusu_list = []
	sosu = 2
	while num != 1:
		sosu_count = 0
		while num % sosu == 0:
			sosu_count += 1
			num /= sosu
		if sosu_count > 0:
			yakusu_list.append((sosu,sosu_count))
		sosu += 1
	insu_wa = 1
	for i in map(lambda x: (x[0]**(x[1]+1)-1)/(x[0]-1),yakusu_list):
		insu_wa *= i
	return insu_wa - row_num

def isyuai(num):
	yuai = False
	if num == yakusu(yakusu(num)) and num != yakusu(num):
		yuai = True
	return yuai

ans = 0
MAX = 10000
for i in range(2,MAX):
	if isyuai(i):
		ans += i

print ans

19番までもいつか残しとこう