起立马扎罗

导航

project euler 1~10

1.This is Python

print(sum(i for i in range(1000) if i%5==0 or i%3==0))

2.加法的重复计算应该可以优化掉

fib_list = [1,2]
while fib_list[-1]+fib_list[-2]<4000000:
	fib_list.append(fib_list[-1]+fib_list[-2])
print(sum(n for n in fib_list if n%2==0))

3.不知道是不是效率最高的方法,反正数字小,瞬间就出结果了

x = 600851475143
i = 2
while i<int(x**0.5):
	if x%i==0:
		x = x/i
	i +=1
print(x)

4.str(x)[-1::-1]什么的真是太方便了...不过python不能直接跳出多重循环,所以只能用标志位了...

is_found = False
for x in range(999999, 100000, -1):
	if str(x)[-1::-1]!=str(x)[:]:
		continue
	else:
		for i in range(999, 100, -1):
			if x%i==0:
				if x/i>100 and x/i<999:
					is_found = True
	if is_found == True:
		break
print(x)

5.Python3里面//代表floor除法,即向下取整

x = 1
l = []
for i in range(2,20):
	if x%i==0:
		continue
	else:
		r = i
		for j in l:
			if(r%j==0):
				r = r//j
		x *= r
		l.append(r)
print(x)

6.This is python

print((sum(i for i in range(101)))**2-sum(i**2 for i in range(101)))

7.素数后面会反复用到,后面会把用筛数法写的取小于某值的所有素数的方法贴上来

primes = [2]
is_prime = True
for i in range(3, 2000000, 2):
	for j in primes:
		if j*j>i:
			primes.append(i)
			break
		if i%j==0:
			is_prime = False
			break;
	is_prime = True
	if len(primes)>10001:
		break
print(primes[10000])

8.呃,这段代码写得好烂,直接转成str就可以分片什么的了,不用这么2的弄成list的,那时候还不会...

digits = r'7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'
digits_list = []
for i in range(len(digits)):
	digits_list.append(int(digits[i]))
result = 0
index = 4
while index<len(digits)-4:
	p = 1
	if int(digits[index])==0:
		index += 5
		continue
	else:
		index += 1
	for i in range(5):
		p *= digits_list[index-i]
	if p> result:
		result = p
print(result)

9.按a<b<c

for a in range(1, 1000//2):
	for b in range(a, (1000-a)//2):
		c = 1000 - a - b
		if(a**2+b**2==c**2):
			print(a*b*c)
			break;

10.呃,稍后贴prime_sieve

import euler
print(sum(euler.prime_sieve(2000000)))

 

posted on 2012-08-30 15:37  起立马扎罗  阅读(200)  评论(0)    收藏  举报