python CG练习题

输入方式

 

a, b, c = map(float, input().split()) 
alist = list(map(int, input().split())) 
n = int(input())

#数组
for i in range(n):
Y[i] = int( input() )

import numpy A=numpy.array(list(map(int, input().split())))
s = str.split()
arr = np.array(s, dtype=int)
#二维数组

arr = [[0] * n] * n
for i in range(n):
    arr[i] = input().split(" ")
arr[i] = [int(j) for j in arr[i]]


# 创建一个 5x3 的数组
x1 = np.arange(15).reshape((5, 3))
x1[2][2]= 999
print(x1)




#
 

 

递归-全排列

import numpy
def Output(alist):
    res = numpy.array(alist)
    print(res)

def PERM(alist,sta,end):
    if sta==end: Output(alist)
    else:
        for i in range(sta,end):
            alist[sta],alist[i] = alist[i] ,alist[sta]
            PERM(alist,sta+1,end)
            alist[sta], alist[i] = alist[i],alist[sta]

alist = list(map(int, input().split()))
PERM(alist,0,len(alist))

迭代法求函数的根

import numpy as np

def cal(k):
    return k**5 - k*2 - 1

def Find( n ):
   Y = np.linspace(alist[0], alist[1], 9)
   # print(Y)
   for i in range(1,9):
        if cal( Y[i-1] )*cal(Y[i]) <0:
            # print(Y[i],Y[i-1],""choose",(Y[i]+Y[i-1])/2)
            Y0.append((Y[i]+Y[i-1])/2  )
        if i<=7 and  ( ( cal( Y[i+1] ) - cal( Y[i] ) )* ( cal( Y[i] ) - cal(Y[i-1]) ) )  < 0  and abs( cal(Y[i]) ) < 0.1:
            # print("find", Y[i])
            Y0.append(Y[i])

def g1(x):
    while abs( (pow( (x*2+1) ,0.2) if(x*2+1>=0) else -pow( -(x*2+1) ,0.2) ) - x ) > delta :
        x =  pow( (x*2+1) ,0.2) if(x*2+1>=0) else -pow( -(x*2+1) ,0.2)
    x = pow( (x*2+1) ,0.2) if(x*2+1>=0) else -pow( -(x*2+1) ,0.2)
    return x

def g2(x):
    while abs( (pow(x,5)-1)/2-x ) > delta :
        x = (pow(x,5)-1)/2
    x = (pow(x,5)-1)/2
    return x

def run(x):
    if x <-0.7 or x >0:
        res = g1(x)
    else : res = g2(x)
    # print("答案是",res)
    return res

if __name__ == "__main__":
    # print("HI")
    alist = list(map(float,input().split()))
    delta = 10**(-int(alist[2]))
    Y0 = list()
    Find(8)
    Y0.sort()
    # print(Y0)
    for i in range(3):
        # print("Y0 is ",Y0[i])
        print( "%.3f" %run( Y0[i] ) )

试值法求根

def cal(x):
    return 12 * 300 * ((1 + x / 12) ** 240 - 1) / x - 500000


def MID(x, y):
    return y - cal(y) * (y - x) / (cal(y) - cal(x))


a, b, c = map(float, input().split())
c = int(c)
cnt = 0
res = a
while b - a > pow(10, -c) / 2:
    mid = MID(a, b)
    if abs(cal(mid)) < 0.0001: break
    if (cal(mid) <= 0):
        a = mid
    else:
        b = mid
    cnt = cnt + 1

print(cnt)
print(round(MID(a, b), c))

牛顿法求根

ee = 2.718281828459045235360287471
def f(x):
    return 9600*( 1 - ee**( -x/15 ) ) - 480 * x
# y=f(t)=9600*(1-e**(-t/15.0)) - 480*t;x=r(t)=2400*(1-e**(-t/15.0))
def f_(x):
    return 9600/15* ( ee**(-x/15) ) - 480

def r(x):
    return 2400*( 1 - ee**( -x/15 ) )

def Cal(a):
    return a - f(a)/f_(a)

if __name__ =="__main__":
    a,b,c = map( float,input().split( ) )
    # print(a,b,c)
    b = 10**(-int(b))
    c = 10**(-int(c))
    # cnt = 0
    while( abs( a-Cal(a) ) > b or abs(   f( Cal(a) ) ) > c ):
        a = Cal(a)
        # cnt = cnt + 1
        # print(cnt,a,abs( a-Cal(a) ) ,abs( f( Cal(a) ) ) ,b,c)

    print("%.5f"% a)
    print("%.5f" % r(a))



    '''
    输出错误  
错误输出:
8 1 1
期望输出:
9.08955
1090.69211
测试数据2    输出错误  
错误输出:
8 3 3
期望输出:
9.08790
1090.54798
    '''

快速排序

import numpy
import math

def find( Thelist,s,e ):
    if( s == e ): return s
    Mid = Thelist[e]
    MinId = s
    for i in range(s,e):
        if( Thelist[i]<=Mid ):
            Thelist[i],Thelist[MinId] = Thelist[MinId],Thelist[i]
            MinId = MinId+1
    Thelist[e], Thelist[MinId] = Thelist[MinId], Thelist[e]
    print(Mid,MinId)
    return MinId

def QuickSort( TheList,s,e ):
    if( s<e ):
        pos = find(TheList,s,e)
        QuickSort(TheList,s,pos-1)
        QuickSort(TheList,pos+1,e)

alist = list(map(int,input().split()))
LEN = len(alist)
QuickSort(alist,0,LEN-1)
print( numpy.array( alist ))

'''
【样例输入】

2 8 7 1 3 5 6 4

【样例输出】

4 3

3 2

1 0

8 7

6 5

[1 2 3 4 5 6 7 8]

'''

 

 

二分找点

def find(l,r):
    mid = int( (l+r)/2 )
    if( l>r ) :return int(-1)
    if( A[mid]== n): return mid
    else:
        if( A[mid]<n ): return find( mid+1,r )
        return find(l,mid-1)

A = list(map(int, input().split()))
n = int(input())
print( find(0,len(A)-1)+1 )

归并排序

import numpy
import math
def Merge(Llist,Rlist):
    res = []
    Lpos,Rpos,pos = 0,0,0
    while Lpos<len(Llist) and Rpos<len(Rlist) :
        if( Llist[Lpos] < Rlist[Rpos] ):
            res.append(Llist[Lpos])
            Lpos= Lpos + 1
        else:
            res.append(Rlist[Rpos])
            Rpos = Rpos + 1
        pos = pos + 1
    res += list( Llist[Lpos:] )
    res += list( Rlist[Rpos:] )
    return res

def MergeSort( L ):
    print(numpy.array(L))
    if( len(L)<=1 ) : return L
    mid = math.ceil( len(L)/2 )
    return Merge( MergeSort( L[:mid] ), MergeSort( L[mid:] ) )

alist = list(map(int,input().split()))
print( numpy.array(MergeSort(alist)))

 二分

def cal(x):
    return 12  * 300  * ((1 + x / 12) ** 240 - 1)/ x - 500000
def MID(x,y):
    return x/2+y/2
    # return y - cal(y)*(y-x)/( cal(y)-cal(x) )

a,b,c = map(float,input().split())
c = int(c)
cnt = 0
while b-a > pow(10, -c):
    mid = MID(a,b)
    cnt = cnt + 1
    if( cal(mid)>=0 ) :  b = mid
    else: a = mid
print(cnt)
print( round(MID(a,b),c) )

上三角线性方程

import numpy as np

if __name__ == "__main__":
    n = int(input())
    arr = [[0] * n] * n
    for i in range(n):
        arr[i] = input().split(" ")
        arr[i] = [int(j) for j in arr[i]]

    Y = [0]*n
    res = [0.0]*n
    for i in range(n):
        Y[i] =  int( input() )

    i = int(n-1)
    res[i] = Y[i]/arr[n-1][n-1]
    i = i - 1
    while i>=0:
        sum = int(0)
        for j in range(i+1,n):
            sum = sum + arr[i][j]*res[j]
        res[i] = ( Y[i]-sum )/arr[i][i]
        i = i-1

    ans = np.array(res).reshape(n,1)
    print(ans)

select算法

import math
flag = 1

def PARTITION(alist,l,r,x):
    pos  = l
    posx = l
    for i in range(l,r+1):
        if alist[i] <= x:
            if( alist[i]==x ):
                posx = i
            alist[pos],alist[i] = alist[i],alist[pos]
            pos = pos + 1
    alist[pos-1],alist[posx] = alist[posx],alist[pos-1]
    return max(pos-1,l)


def SELECT( alist,l,r,n ):
    global flag
    Len = r - l + 1
    if Len <= 10:
        alist[l:r+1] = sorted( alist[l:r+1] )
        return alist[  max(int(l+n-1),l)]

    #分组递归求中位数的中位数,其实就是找基准的过程
    Groups = Len//5  #这么多组
    L = l
    TemList = []
    for i in range(Groups-1):
        TemList.append( SELECT( alist,L,L+4,3 ) )
        L = L+5
    TemList.append( SELECT(alist, L, r, (r-L+2)//2 ) )
    x = SELECT(TemList , 0 , Groups-1 ,(Groups+1)//2 )  #分组后的中位数取第(num_group/2向上取整)小的元素。
    if flag == 1 :
        print(x)
        flag = 0

    #以x为基准寻找小于基准的下标位置q
    q = PARTITION( alist,l,r,x)
    nums = q-l+1
    if nums == n:
        return x
    elif nums>n:
        return SELECT(alist,l,q-1,n)
    return int(SELECT(alist,q+1,r,n-nums))

if __name__ == "__main__":
    alist = list( map(int,input().split()) )
    n = int( input() )
    # print(alist,n)
    print( SELECT( alist,int(0),int(len(alist)-1),int(n) ) )


'''
测试数据1    输出错误  
错误输出:
2 9 8 0 7 10 1 12 3 14 5 13 6 11 4
3
期望输出:
7
2
测试数据2    输出错误  
错误输出: 
32 22 28 11 24  8  9 12 10 19 36 16 39 50 14 30 21 23  3 43 46 35 17 31 18 42 44 34 27 33 15 45 29  5 13 38 26  6  0  1 47 40 41 25  7 20  2  4  37 49 48
20

期望输出:
23
19
'''

 

posted @ 2020-03-09 23:57  SunCY  阅读(304)  评论(0编辑  收藏  举报