Advertisement

麻省理工学院公开课:计算机科学及编程导论习题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的所有质数的指数进行累加,并将这一总和与给定数值进行比较分析;其指数之和相对于给定数值的比例,在数值增大时接近1;请提供不同数值供进一步分析。

复制代码
 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)

全部评论 (0)

还没有任何评论哟~