Project Euler Problem 19:
思路:本题是求从1901-01-01到2000-12-31这200年中有多少个星期天是一个月的第一天,例如1901-09-01这天是周日,同时也是9月第一天;所以我们可以先从年份开始循环,内层嵌套月份的循环,再对每月份的第一天进行判断是不是周日,是则统计加1,不是则跳过,代码如下:
# coding utf-8
# Desc : Project Euler Problem 19 Counting Sundays
# Date : 2015-12-22
# Author : Tina
# Jun 01st 1900 Monday 1901-01-01 -- 2000-12-31
# So 1901-01-01 is Tursday
# 31 days : 1 3 5 7 8 10 12
# 30 days : 4 6 9 11
# 28 or 29 days : 2
count = 0
sums = 2
for x in xrange(1901, 2001): # for each year
a = [31,28,31,30,31,30,31,31,30,31,30,31] # how many days in every month
if(x%4 == 0 and x%400 != 0):
a[1] = 29
for y in xrange(12): # for each month
if(sums%7 == 0):
if(y >= 9):
print str(x)+'-'+str(y+1)+'-01'
else:
print str(x)+'-0'+str(y+1)+'-01'
count = count+1
days = a[y]
sums = sums+days
print count
# Result 171 days
Project Euler Problem 20:
思路:求100的阶乘得到的数,每个数字相加的结果,这个没什么,python支持长整型,直接算出结果相加,唯一注意的就是强制转换了~~代码如下:
# coding utf-8
# Desc : Project Euler Problem 20 Factorial digit sum
# Date : 2015-12-22
# Author : Tina
def factorial(n):
multipy = 1
for x in xrange(1, n+1):
multipy = multipy*x
return multipy
multipy = str(factorial(100)) # Turn into string
sums = 0
for n in multipy:
sums = sums+int(n)
print sums
# Result 648
Project Euler Problem 21:
思路:求1000以下的友好型数字,数字满足条件:数字a的因子的和b等于b的因子的和,即x(a)=b,x(b)=a,直接上代码:
# coding utf-8
# Desc : Project Euler Problem 21 Amicable numbers
# Date : 2015-12-22
# Author : Tina
import time
def amicable(num):
sums = 0
for i in xrange(1, int(num/2)+1):
if(num%i == 0):
sums = sums+i
return sums
timeStart = time.time()
sums = 0
for j in xrange(1,10000):
if(amicable(amicable(j)) == j and amicable(j) != j):
sums = sums+j
print sums
timeEnd = time.time()
print timeEnd-timeStart
# Result 31626
Project Euler Problem 22:
思路:统计名字权值的和,首先将每个名字拆分开,再单个求和,代码如下:
# coding utf-8
# Desc : Project Euler Problem 22
# Date : 2015-12-22
# Author : Tina
files = open('names.txt')
try:
names = files.read().split(',')
total = 0
i = 1
names.sort() # order by alphabetical
for name in names:
single = 0
name = name[1:-1] # remove quote
for n in name:
single = single + ord(n) - 64 # turn char into ASC
multipy = single*i
total = total + multipy
i = i+1
print total
finally:
files.close()
# Result 871198282