麻省理工学院公开课:计算机科学及编程导论习题1

习题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)


你可能感兴趣的:(麻省理工学院公开课:计算机科学及编程导论习题1)