projecteuler.net 题目笔记 [1-5]

题目1:找出1000以下自然数中3和5的倍数之和。

10以下的自然数中,属于3和5的倍数的有3,5,6和9,它们之和是23.

找出1000以下的自然数中,属于3和5的倍数的数字之和。

s=0
for i in range(1000):
    if i%3 == 0 or i%5 ==0:
        s += i
print s

>>> 

233168



题目2:在斐波那契数列中,找出4百万以下的项中值为偶数的项之和。

斐波那契数列中的每一项被定义为前两项之和。从1和2开始,斐波那契数列的前十项为:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

考虑斐波那契数列中数值不超过4百万的项,找出这些项中值为偶数的项之和。

fnList=[1,2]    # 初始化
fnSum=2         # 求偶数项的和
flag=0          # 在fnList0,1位置不断切换
while True:
    fnList[flag] = sum(fnList)
    if fnList[flag] > 4000000:
        break
    if fnList[flag] %2 == 0:
        fnSum += fnList[flag]
    flag=abs(1-flag)
print fnSum

>>> 

4613732

一句话:

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



题目3:找出一个合数的最大质数因子

13195的质数因子有5,7,13和29.

600851475143的最大质数因子是多少?

什么是质数因子,素数 没搞懂. 略过



题目4:找出由两个三位数乘积构成的回文。

一个回文数指的是从左向右和从右向左读都一样的数字。

最大的由两个两位数乘积构成的回文数是9009 = 91 * 99.

找出最大的有由个三位数乘积构成的回文数。

def loop(n):
    res = [0]*3
    for i in range(n):
        for j in range(n):
            mul = i*j
            if str(mul) == str(mul)[::-1]:
                if mul > res[2]:
                    res[0],res[1],res[2] = i,j,mul
    return res
print loop(100)

>>> 

[913, 993, 906609]



题目5:找出最小的能被1-20中每个数整除的数。

2520是最小的能被1-10中每个数字整除的正整数。

最小的能被1-20中每个数整除的正整数是多少?

def loop(a,b):
    # 这算法真TNND烂. 
    if a>b:a,b=b,a
    ss = 1
    while True:
        if map(lambda x:ss%x==0, range(a,b+1)) == [True]*(b-a+1):
            break
        ss += 1
    return ss
print loop(1,20)

这算法无法直视, 还是待用最小公倍数方法


你可能感兴趣的:(projecteuler.net 题目笔记 [1-5])