ihit's diary

ちょっとしたメモに

Project Euler 24, 25

24番
0~9の順列の100万番目を求める問題

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

num_list = range(0,10)
#0から数え始める
Order = 1000000
Order -= 1
ans = 0
for i in range(0,10):
	tmp = 1
	for j in range(1,10 - i):
		tmp *= j
	ans = ans * 10 + num_list[Order / tmp]
	num_list.pop(Order / tmp)
	Order = Order % tmp
print ans

25番
1000桁になるフィボナッチ数列の番目を求める問題

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

Fn = [1]
Fn_1 = [1]

iterate = 2
while 1:
	C = 0
	save = Fn[:]
	for i in range(0,len(Fn_1)):
		Fn[i] = Fn[i] + Fn_1[i] + C
		C = Fn[i] / 10
		Fn[i] = Fn[i] % 10
	if len(save) > len(Fn_1):
		Fn[len(Fn)-1] += C
		C = 0
	if C > 0:
		Fn.append(C)
	Fn_1 = save
	iterate += 1
	if len(Fn) >= 1000:
		break

print iterate

リストをコピーするには
a = b
じゃなくて
a = b[:]
でやらないとbの値変えた時aの中身も変化してしまう

変数に1000桁入らないんじゃないかと思ってリストでやったけどそんなことなかったみたい。だから

def f(n):
	x = 1
	y = 1
	z = 2
	while 1:
		x,y,z = x+y,x,z+1
		if len(str(x)) >= n:
			break
	return z

print f(1000)

の方が簡単だし速い