计算机科学导论第三次作业
Posted 代码嘻嘻代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机科学导论第三次作业相关的知识,希望对你有一定的参考价值。
3.1
(二分法求方程根)
m_max=2
m_min=1
i=0
x=(m_max+m_min)/2
while(abs(x**3+x**2-10)>0.0000001):
if(x**3+x**2>10):
m_max=x
else:
m_min=x
x=(m_max+m_min)/2
i+=1
print('%d:%.12f'%(i,x))
(牛顿迭代法)
c=10
x=c/3
i=0
while abs(x**3+x**2-c)>0.000000001:
x=(2*x**3+x**2+c)/(3*x**2+2*x)
i+=1
print('%d:%.12f'%(i,x))
3.2 求圆周率(蒙特卡洛法)
import random
def pi(times):
sum=0
for i in range(times):
x=random.random()
y=random.random()
d2=x*x+y*y
if d2<=1:
sum+=1
return(sum/times*4)
times=10**9
x=pi(times)
print('pi=%.8f'%(x))
3.3 (多种求圆周率的方法)
def arctan(x,n):
while n<0:
return 0
return arctan(x,n-1)+((-1)**n)*((x**(2*n+1))/(2*n+1))
k=eval(input())
π= 16* arctan(1/5,k) - 4*arctan(1/239,k)
print('在%d次下,π=%.14f'%(k,π))
def a():
a=1
a=a*i
return a
def b():
b=1
b=b*(2*i+1)
return b
g=1
i=1
s=1
while g>1e-16:
g=g*(a()/b())
i+=1
s+=g
print(2*s)
3.4 《计算机导论》练习题 1.5.3, 1.5.4, 1.5.5, 1.5.6, 1.5.7
1.5.3 利用大数据可以获得患病人群的流动情况,来达到减小或者避免传染病的传播情况。同时大数据可为公共卫生问题的重大决策提供参考。
1.5.4 近几百年以来,战争逐渐减少,而全球温度不断升高。推断战争增多会使全球气温降低。
1.5.5 令A:x=y,B:x*x=y*y。A是B的充分条件,B是A的必要条件。
1.5.6令A:x=y,B:x**3=y**3。A是B的充分必要条件,B是A的充分必要条件。
1.5.7 若P则Q为真 有两种情况:1)P根本没有发生,即非P,不存在Q的判断2)P发生了且Q发生了。
3.5 《编程导论》练习题2.1.2 和 2.1.3
x=0
y=2
i=0
a=7.378*0.5
for i in range(1,10):
x+=0.5
y+=a
print('y=%.3f x=%.1f'%(y,x))
a=2
n=5
p=2
sum = 0
for i in range (0,n):
sum=sum+a*p**i
print(sum)
3.6 《编程导论》2.1.2节的第二种方法和第三种方法
print('第二种方法')
L=[12,32,45,78,22]
min = max =L[0]
for i in range (1,len(L)):
if min>L[i]:
min=L[i]
elif max<L[i]:
max=L[i]
print('The min number is',min)
print('The max number is',max)
print('第三种方法')
L=[12,32,45,78,22]
if L[0]<L[1]:
min=L[0];max=L[1]
for i in range (2,len(L)-1,2):
if L[i]>L[i+1]:
if min>L[i+1]:
min=L[i+1]
if max<L[i]:
max=L[i]
else:
if min>L[i]:
min=L[i]
if max<L[i+1]:
max=L[i+1]
if len(L)%2!=0:
if min>L[len(L)-1]:
min = L[len(L)-1]
elif max <L[len(L)-1]:
max=L[len(L)-1]
print('The min number is',min,'The max number is',max)
3.7 判断质数
import math
def check_prime(n):
k=int(math.sqrt(n))
if n<2:
print('既不是质数也不是合数')
else:
for i in range(2,k+1):
if n%i==0 :return False
return True
n=int(input())
print(check_prime(n))
3.8 斐波那契数列与质数
import math
def check_prime(n):
k=int(math.sqrt(n))
for i in range(2,k+1):
if n%i==0 :return False
return True
def F(n):
a=0
b=1
for i in range(n):
a,b=b,a+b
return a
for i in range(100):
a=F(i)
if check_prime(i)and not check_prime(F(i)):
print(i)
3.9(递归二分查找)
def s(L,k):
if L==[]:
return False,-1
if len(L)==1:
if k==L[0]:
return True,0
return False,-1
if k==L[len(L)//2]:
return True,len(L)//2
if k<L[len(L)//2]:
return s(L[0:len(L)//2],k)
else:
flag,index=s(L[len(L)//2:],k)
return flag,len(L)//2+index
L=[1,2,3,4,5]
print(s(L,5))
3.10
def s(L,a):
min=0;max=len(L)-1;mid=(max+min)//2
while not (L[mid]==a)and(min<=max):
if L[mid]<a:
min= mid + 1
else:
max=mid-1
mid=(max+min)//2
if L[mid]==a:
return mid
else:
return -1
import time
k=50000*4;L=[]
for i in range(k):L.append(i)
start = time.time()
for i in range(k):
if s(L,k+1)>=0: continue
elapsed=time.time()-start
print('使用自己写的binay search花时间:',elapsed)
start = time.time()
for i in range(k):
if k+1 in L:continue
elapsed=time.time()-start
print('使用Pyhon in 花时间:',elapsed)
3.11 (元素排序)
L=[12,11,3,11,6,11,12,3,11]
L.sort()
L1=[]
L2=[]
for i in L:
if i not in L2:
L2.append(i)
for i in L2:
count=L.count(i)
L1.append([i,count])
for i in range(len(L1)-1):
min = i
for j in range(i+1,len(L1)):
if L1[j][1]<L1[min][1]:
min=j
L1[min],L1[i]=L1[i],L1[min]
print(L1)
3.12 (质数拆分)
import math
def check_prime(n):
k=int(math.sqrt(n))
if n<2:
print('既不是质数也不是合数')
else:
for i in range(2,k+1):
if n%i==0 :return False
return True
def check_sqrt(n):
a=int(n**0.5)
if a*a==n:
return True
def c(n):
if check_prime(n):
i =int(n**0.5)
for a in range(i):
if check_sqrt(n-a**2):
b=int(math.sqrt(n-a**2))
print(n,'=',a,'*',a,'+',b,'*',b)
break
else:
print(-1)
3.13 21点游戏
import random
def shuffle(L):
for i in range(len(L)):
j=random.randint(0,len(L)-1)
L[i],L[j]=L[j],L[i]
def deal(L):
w=L[0:2];z=L[2:4]
i=4
print('当前玩家手牌:',w,'点数和为:',point(w))
print('当前庄家明牌:',z[0])
opt=input('请选择是否继续拿牌(Y:拿牌,N:停牌):')
while opt=='Y' or opt=='y':
w.append(L[i]);i+=1
print('当前玩家手牌:',w)
opt=input('请选择是否继续拿牌(Y:拿牌,N:停牌):')
if point(w)>21:
print('已经结束咧!')
break
while point(z)<17:
z.append(L[i]);i+=1
return [w,z]
def point(L):
sum=0
num1=0
for i in L:
if i==1:
num1+=1
sum+=i
if num1!=0:
if sum+10<=21:
return sum+10
else:
return sum
else:
return sum
L=[1,2,3,4,5,6,7,8,9,10,10,10,10]*4
zw=0;yw=0
for i in range(10**5):
shuffle(L)
[w,z]=deal(L)
print("玩家最终手牌:",w)
print("玩家最终手牌点数和:",point(w))
print("庄家最终手牌:",z)
print("庄家最终手牌点数和:",point(z))
if point(w)>21 :print("Boom!You died!")
elif point(z)>21 or point(z)<point(w):print("You Win!")
elif point(z)==point(w): print("It's a draw!")
else:print("You lose!")
以上是关于计算机科学导论第三次作业的主要内容,如果未能解决你的问题,请参考以下文章