计算机科学导论第三次作业

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!")

以上是关于计算机科学导论第三次作业的主要内容,如果未能解决你的问题,请参考以下文章

第三次作业

0024第三次作业

第三次作业

第三次作业

第三次作业

第三次作业