高级语言和低级语言之间需要一个转换的工具:编译器
、解释器
低级语言
- 面向机器的语言,包括机器语言、汇编语言
- 不同的机器不能通用,不同的机器需要不同的机器指令或者汇编程序
高级语言
- 接近自然语言和数学语言的计算机语言
- 高级语言首先要书写源程序,通过编译程序把源程序转换成机器指令的程序
- 1954年正式发布的Fortran语言是最早的高级语言,本意是公式翻译
编译器
编译器是把源代码整个编译成目标代码,执行时不在需要编译器,直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如C和C++等语言的代码被编译成二进制代码(exe程序),在windows平台上执行。
解释器
解释器是一条一条的解释执行源语言。比如Python、JAVA、javascript、PHP就是典型的解释性语言。它们的代码需要被解释器编程中间代码(Bytecode),在虚拟机上运行。
- 编译语言,把源代码转换成目标机器的CPU指令
- 解释语言,解释后转换成字节码,运行在虚拟机上,解释器执行中间代码
- 编译器的优点:执行效率远远高于解释运行的程序
- 解释器的优点:比较容易让用户实现自己跨平台的代码
素数
质数(prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
判断一个数是否是素数
num = int(input('请输入一个数>>>'))
if num % 2 == 0:
print('该数是质数')
quit()
if num % 5 == 0:
print('该数是质数')
quit()
if num % 3 == 0:
print('该数是质数')
quit()
if num > 5:
for i in range(7,int((num**0.5)+1),2):
if num % i == 0:
print('该数不是质数')
break
else:
print('该数是质数')
素数的定义是从2开始到自身的-1的数中找不到一个能整除的,即为素数。
优化点一:可以简化到从2开始到自身开平方的数中找到一个能整除的,即为素数。
优化点二:同时素数也不会被一个偶数整除,所以在range函数中设置步长为2,跳过所有偶数。
优化点三:通过2、3、5筛选大量的数。
求100万以内的素数
start = datetime.datetime.now()
print(2,3,5,end=' ')
for i in range(7,1000000,2):
if i % 5 == 0:
continue
if i % 3 ==0:
continue
for j in range(7,int((i**0.5))+1,2):
if i % j == 0:
break
else:
print(i,end=' ')
end = datetime.datetime.now()
print(end-start,'s')
测试用时 3.83s 3.56s 3.76s 4.01s 3.84s
start = datetime.datetime.now()
prime = [2,3]
flag = True
for i in range(7,100000,2):
if i % 5 == 0:
continue
for j in prime:
if i % j == 0:
flag = False
break
if j >= (i**0.5)+1:
flag = True
break
if flag:
prime.append(i)
print([5]+prime)
end = datetime.datetime.now()
print(end-start,'s')
测试用时 5.11s 4.92s 4.93s 5.23s 5.06s
因为一个合数一定可以分解成几个素数的乘积,也就是说,一个数如果能被一个素数整除就是合数
所以设置一个列表接收依次验证所得的素数进行后续的检验。
同时在素数的验证中加入“从2开始到自身开平方的数中找到一个能整除的,即为素数”的概念,减少取列表中的素数验算自身的次数。
素数出现的规律是结尾为1、3、7、9的数,所以提前与5进行计算排除结尾为5的数。
start = datetime.datetime.now()
prime = [3]
flag = True
for i in range(7,100000,2):
if i % 5 == 0:
continue
for j in prime:
if i % j == 0:
flag = False
break
if j >= (i**0.5)+1:
flag = True
break
if flag:
prime.append(i)
print([2,5]+prime)
end = datetime.datetime.now()
print(end-start,'s')
测试用时 4.91s 4.86s 4.68s 4.78s 4.48s
因为我们在提供测试数据的时候已经淘汰了偶数,所以把2暂时移出素数集,减少计算次数。