习题1:
编辑一个程序,显示出第1000个质数。
质数的特性是只能被1和自己整除,所以所有算法都由此引开。
因为一开始漏看了“th”,所以以为是1~1000里面的质数...
这是一种算法,这两种的效率差不多:
print "2",
for x in range(3, 1001):
y = 2
while x % y != 0 and x > y:
y = y + 1
if y == x:
print x,
print "2",
for x in range(3, 1001):
for y in range(2, x):
if x % y == 0:
break
elif y == x - 1:
print x,
这种算法需要算出所有数字的余数,所以最慢,但是思考起来最简单的。
for x in range(1, 1001):
count = 0
for y in range(1, x + 1):
if x % y == 0:
count += 1
if count == 2:
print x,
这种算法是在别处抄的,运算速度最快,但并不明白其中的数学原理,说不定以后哪天会突然明白。
i = 2
while(i < 1001):
j = 2
while(j <= (i/j)):
if not(i%j): break #if i%j == 0
j = j + 1
if (j > i/j) : print i,
i = i + 1
下面开始正式解题,最终得出第1000个是7919。
x = 3
order = 1
while x > 2 and order < 1000:
count = 0
for y in range (1, x+1):
if x % y == 0:
count += 1
x += 1
if count == 2:
order += 1
if order == 1000:
print x-1
另外一种算法:
x = 3
order = 1
while x > 2 and order < 1000:
y = 2
while x % y != 0 and x > y:
y = y + 1
if y == x:
order = order + 1
if order == 1000:
print x
x = x + 1
或者
x = 3
pn = [2]
while x > 2 and len(pn) < 1000:
y = 2
while x % y != 0 and x > y:
y = y + 1
if y == x:
pn.append(x)
x = x + 1
print pn[-1]
第一种由于计算了所有余数,后者只计算了部分余数,所以速度比后者要慢很多。前者2.89秒,后者0.61秒。
习题2:
计算2到n的所有质数指数的和,并把这个和的值与n相比;小于n的素数的指数的和与n的比值,随着n的增加会趋近1;输入不同的n值。
from math import log
n = int(input("Please enter a number for variable n: "))
log_sum = log(2)
for x in range(3, n+1):
y = 2
while x % y != 0 and x > y:
y = y + 1
if y == x:
log_sum = log_sum + log(x)
print "sum = %r" % log_sum
print "n = %r" % x
print "ratio = %r" % (log_sum/x)
如果做成模块的话
def get_prime(x):
x = int(x)
if x == 1:
return False
elif x == 2:
return True
else:
for y in range(2, x):
if x % y == 0:
return False
break
elif y == x - 1:
return True
from math import log
n = int(input("Please enter a number for variable n: "))
log_sum = 0
for x in range(2, n+1):
if get_prime(x):
log_sum = log_sum + log(x)
print "sum = %r" % log_sum
print "n = %r" % n
print "ratio = % r" % (log_sum/n)