夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

Arenaからログインできなかった。

今日はなんかArenaでタイムアウトするバグ(ツイッターで同じ事言ってる人がいたのでたぶんそう)が起こってたので過去問ではなくProjectEulerやってました。

ただ、なんとなく過去問より短い時間で解けるという自信からかちょっとやりすぎてしまう・・・

というわけで今日やった分のソースうp

1~101までの二乗の和と和の二乗の差を求めよ

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

def main():
	x,y = 0,0;
	for i in range(1,101):
		x += i*i
		print i
	for i in range(1,101):
		y += i
	y = y*y
	res = x-y
	if res < 0:
		res *= -1
	print res

if __name__ == '__main__':
	main()

10001番目の素数を求めよ

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

def main():
	f = range(2,200000)
	i = 0
	while True:
		for j in f:
			if j == f[i]:
				continue
			elif j%f[i]==0:
				f.remove(j)
		i += 1
		if i >= len(f):
			break
	res = f[10000]
	print res, " ", f[2]

if __name__ == '__main__':
	main()

与えられた1000桁の数字のある5つの連続した数の積のうち最大値を求めよ。

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

def main():
	num = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"
	i = 0
	l = []
	while i < 1000:
		if num[i] == '0':
			i += 1
			continue
		if num[i+1] == '0':
			i += 2
			continue
		if num[i+2] == '0':
			i += 3
			continue
		if num[i+3] == '0':
			i += 4
			continue
		if num[i+4] == '0':
			i += 5
			continue
		l.append(int(num[i])*int(num[i+1])*int(num[i+2])*int(num[i+3])*int(num[i+4]))
		i += 1
	l.sort()
	res = l[-1]
	print res

if __name__ == '__main__':
	main()

外周が1000になる直角三角形をみつけよ

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

from math import pow

def main():
	a = range(1,333)
	b = range(2,500)
	c = range(3,998)
	res = 1
	for i in a:
		for j in b:
			for k in c:
				if i < j < k:
					if i < j < k and pow(i,2)+pow(j,2)==pow(k,2) and i+j+k==1000:
						res = i*j*k
						print i, " ", j, " ", k
						break
			if res != 1:
				break
		if res != 1:
			break
	print res

if __name__ == '__main__':
	main()

どうもProjectEulerの問題解いてると、真正面からぶつかったほうが一番答えが出やすい気がするのですが・・・

効率的なものを書いたほうがいいんですかね?

p.s.今日のCodeforcesは参加するか迷っております。