1、10以下的自然数中,属于3或5的倍数的数字有3,5,6,9,它们之和为23找出1000以下的自然数中,属于3或5倍数的所有数字之和。
"""
欧拉计划
10以下的自然数中,属于3或5的倍数的数字有3,5,6,9,它们之和为23
找出1000以下的自然数中,属于3或5倍数的所有数字之和
"""
def exactNum(m,n,num):
if num%m==0 or num%n==0:
return True
else:
return False
sum=0
for i in range(1,1000):
if exactNum(3,5,i):
sum=sum+i
print("1000以内整数中属于3或5倍数的所有数字之和为:"+str(sum))
2、找出斐波那契数列中数值不超过400万的项,求这些项中为偶数的项之和
"""
欧拉计划
找出斐波那契数列中数值不超过400万的项,求这些项中为偶数的项之和
"""
fibo=[1,2]
sum=2
a=0
while a<4000000:
lenf=len(fibo)
a=fibo[lenf-1]+fibo[lenf-2]
fibo.append(a)
if a%2==0:
sum=sum+a
print("求和结果为:"+str(sum))
3、找出一个合数的最大质因数,如13195的质因数包括:5,7,13和29,29是其最大质因数。请找出600851475143的最大质因数。
import time
import math
def isPrime(n):
if n<2:
return False
elif n==2:
return True
else:
m=int(math.sqrt(n))
for i in range(2,m+1):
if n%i==0:
return False
return True
"""
思路:
从小到大逐数判断是否为因数,再判断该因数是否为质数,加入质因数列表
再判断该因数对应的因数是否为质数,如是,加入质因数列表
"""
def findMaxpn(n):
list=[]
m=int(math.sqrt(n))
for i in range(2,m+1):
if n%i==0:
if isPrime(i):
list.append(i)
if isPrime(n/i):
list.append(n/i)
if list:
list.sort()
print(list)
return list[-1]
else:
print("参数为质数,不符合条件!!")
return 0
start1=time.clock()
print(findMaxpn(600851475143))
end1=time.clock()
print("方法一耗时"+str(end1-start1)+"s")
运行结果:
[71, 839, 1471, 6857]
6857
方法一耗时0.2167969211667917s
4、一个回文数是指从左向右和从右向左都一样的数字。最大的由两个两位数乘积构成的回文数9009=91*99;找出最大的由两个三位数乘积构成的回文数。
import copy
import time
start=time.clock()
#先定义一个判断回文数的函数
def isPalindrome(n):
m=n
list=[]
#把n的各位倒序插入列表
while m!=0:
list.append(m%10)
m=int(m/10)
#下一句不能简单的用listx=list代替
#这样无法真正生成一个新列表赋给listx,而是把list的引用赋给了listx
#如果修改list或者修改listx,其实都是修改的引用指向的内容
#会同时影响listx和list
listx=copy.deepcopy(list)
list.reverse()
if list==listx:
return True
else:
return False
list=[]
for i in range(100,1000):
for j in range(i,1000):
s=i*j
if isPalindrome(s):
list.append(s)
print(list)
list.sort()
print(list[-1])
end=time.clock()
print("总耗时:"+str(end-start)+"seconds")
5、找出能被1到20之间各个数整除的正整数
#找出能被1到20之间各个数整除的正整数
import math
import time
start=time.clock()
def isPrime(n):
if n<2:
return False
elif n==2:
return True
else:
s=int(math.sqrt(n))
for i in range(2,s+1):
if n%i==0:
return False
return True
def findMax(n):
#找出1~n之间的各个质数,并求其乘积
s=1
for i in range(2,n+1):
if isPrime(i):
s=s*i
lista=list(range(2,n+1))
m=s
#最终结果必定为前面质因数乘积的倍数
#遍历列表,遇见不能整除的则加一次质数乘积
#再重新遍历,直到都可以整除
while True:
a=1
for x in lista:
if m%x!=0: #不能整除,须加一次再进入到下次循环重新遍历
a=0
break
if a==1:
break
m=m+s
return m
print(findMax(20))
end=time.clock()
print("共耗时:"+str(end-start)+"秒!")