Python四六級考試,快來測試一下自己的編程水平吧

      網(wǎng)友投稿 1316 2022-05-29

      文章目錄

      1 選擇題(每題2分,共20分)

      2 簡答題(每題3分,共30分)

      3 應用題(每題5分,共50分)

      3.1 龐大的牛群

      3.2 古堡之門

      3.3 二維列表轉(zhuǎn)置

      3.4 用print函數(shù)畫圓

      3.5 約瑟夫環(huán)

      3.6 撲克牌中的順子

      3.7 青蛙上臺階

      3.8 24點游戲

      3.9 背包問題

      3.10 空間直線相交問題

      參-

      1 選擇題

      2 簡答題

      3 應用題

      3.1 龐大的牛群

      3.2 古堡之門

      3.3 二維列表轉(zhuǎn)置

      3.4 用print函數(shù)畫圓

      3.5 約瑟夫環(huán)

      3.6 撲克牌中的順子

      3.7 青蛙上臺階

      3.8 24點游戲

      3.9 背包問題

      3.10 空間直線相交問題

      不要當真,這只是一套模仿英語四六考試的Python編程能力自測題,完全基于Python基礎(chǔ)語法和標準模塊,僅最后一題,用到了NumPy模塊。參-附于文末,讀者可自行核對。如果得分超過60分,相當于英語四級水平;得分超過80分,相當于英語六級水平。

      1 選擇題(每題2分,共20分)

      A C是其中最早古老的

      B C#是其中最年輕的

      C C++比Java的歷史更久

      D Java比Python的歷史更久

      A 詹姆斯·高斯林(James Gosling)

      B 林納斯·托瓦茲(Linus Torvalds)

      C 吉多·范羅蘇姆(Guido van Rossum)

      D 廖雪峰

      A [1,2,3]

      B [4,5]

      C [5,3,1]

      D 顯示異常信息

      A [1,2,9,9,5]

      B [1,2,9,5]

      C [1,2,[9],5]

      D 顯示異常信息

      A d[‘name’]

      B d.name

      C d.get(‘name’)

      D d.get(‘a(chǎn)ge’)

      A a[0] = b[1]

      B a[0] == b[1]

      C a+b

      D (*a, *b)

      A list(s)

      B set(s)

      C tuple(s)

      D dict(s)

      A [i if i%2 else i*2 for i in range(5)]

      B [i if i%2 for i in range(5)]

      C [i for i in range(5) if i%2]

      D x = 3 if 3*7==21 else 4

      [True, 5, 0, False, None, '0', '', 'False'].count(False)

      1

      A 1

      B 2

      C 3

      D 4

      ''.join(map(lambda s:s*2, 'abc'))

      1

      A ‘a(chǎn)bcabc’

      B [‘a(chǎn)a’, ‘bb’, ‘cc’]

      C [‘a(chǎn)bc’, ‘a(chǎn)bc’]

      D ‘a(chǎn)abbcc’

      2 簡答題(每題3分,共30分)

      3 and 4 * 5 or 6

      1

      z = zip('xyz', (1,2,3)) for i in range(2): for k, v in z: print('%s=%d'%(k,v))

      1

      2

      3

      4

      import threading import time def func(): for i in range(5): print(i) time.sleep(1) threading.Thread(target=func).start() time.sleep(3) print('程序結(jié)束')

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      3 應用題(每題5分,共50分)

      3.1 龐大的牛群

      假定你現(xiàn)在養(yǎng)了一頭母牛,它每年元旦都生一頭小母牛。每頭小母牛從四周歲開始,每年元旦也生一頭小母牛。不考慮牛的壽命和生育年限,過了n個元旦之后,你總共擁有多少頭牛?

      3.2 古堡之門

      福爾摩斯到某古堡探險,看到門上寫著一個奇怪的算式:

      ABCDE × G = EDCBA

      1

      他對華生說:“ABCDE應該代表不同的數(shù)字,G也代表某個數(shù)字!”

      華生:“我猜也是!”

      于是,兩人沉默了好久,還是沒有算出合適的結(jié)果來。

      請利用計算機的優(yōu)勢,找到破解的答案。

      3.3 二維列表轉(zhuǎn)置

      嚴格講,Python的列表并沒有維度的概念。這里說的二維列表是指類似下面這樣的列表。

      [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]

      1

      2

      3

      請實現(xiàn)二維列表的轉(zhuǎn)置(行列互換,首行變首列,尾行變尾列,如下所示)。

      [ [1, 4, 7], [2, 5, 8], [3, 6, 9] ]

      1

      2

      3

      3.4 用print函數(shù)畫圓

      使用print()函數(shù)打印星號,形成一個近似的圓。考慮到在文本顯示模式下字符的寬高不相等,以及字符水平間距和行間距不相等等因素,可以在水平方向重復字符以保持合適的看高比例。

      3.5 約瑟夫環(huán)

      從1開始的n個連續(xù)整數(shù)順時針組成n個元素的環(huán)形隊列,從元素1開始沿順時針方向計數(shù),將第m個元素剔除隊列,緊接著從下一個元素重新開始計數(shù),將第m個元素剔除隊列……直至隊列剩余一個元素,并返回該元素的值。

      3.6 撲克牌中的順子

      從撲克牌中隨機抽5張牌,判斷是不是順子,即這5張牌是不是連續(xù)的。2~10為數(shù)字本身,A為1,J為11,Q為12,K為13,大小王用0表示,可代表任意數(shù)字。

      3.7 青蛙上臺階

      青蛙每次至少可以跳上一層臺階,最多可以跳上兩個臺階,計算青蛙跳上N層臺階總共有多少種方式。

      3.8 24點游戲

      幾乎每個人都玩過24點游戲,規(guī)則也很簡單:任意給出4個數(shù)字(視難度不同,一般是10以內(nèi)或13以內(nèi)的數(shù)字,允許重復),每個數(shù)字只能且必須使用1次,利用加減乘除四則運算,使得計算結(jié)果為24。例如,4個數(shù)字分別為5,5,5,1,則有(5-1/5)*5 = 24。請用代碼解決24點問題,若有解,則打印解,若無解,則打印無解。

      3.9 背包問題

      在一款英雄對戰(zhàn)游戲中,玩家擁有m件裝備和n位英雄,他可以給每一位英雄分配0件或多件裝備,而不同的英雄擁有不同數(shù)目的裝備時將獲得不同的攻擊力。玩家如何分配這m件裝備,可以使得n個英雄獲得的攻擊力的和最大?以玩家擁有5件裝備和3位英雄為例,列表p共有3行6列,對應著3位英雄分別擁有從0到5件裝備時的攻擊力。

      3.10 空間直線相交問題

      ABCD是歐氏空間中不重合的四個點,判斷過點AB的直線和過點CD的直線是否相交。

      參-

      1 選擇題

      DCCBBADBBD

      2 簡答題

      參-1

      >>> 0xab + 0b1100 183

      1

      2

      參-2

      >>> int('0xab', base=16) + int('0b1100', base=2) 183

      1

      2

      參-

      >>> ''.join([chr(ord('A')+i) for i in range(26)]) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

      1

      2

      參-

      >>> cmd = input('請變量名和變量值(以等號分隔):') 請變量名和變量值(以等號分隔):x=5 >>> exec(cmd) >>> x 5

      1

      2

      Python四六級考試,快來測試一下自己的編程水平吧

      3

      4

      5

      參-

      >>> s = 'erwerflkfjsfldkfberwefrasdafsasfdadfasd' >>> max(set(s), key=s.count) 'f'

      1

      2

      3

      參-

      def is_isomo(n): return str(n*n)[-len(str(n)):] == str(n) >>> is_isomo(5) True

      1

      2

      3

      4

      5

      這段代碼中兩次使用str(n),效率一定會打折,追求完美的同學肯定無法接受。下面的代碼使用了海象符號(Py3.8及更高版本支持),可以完美地解決這個問題。

      def is_isomo(n): return str(n*n)[-len((s:=str(n))):] == s >>> is_isomo(6) True

      1

      2

      3

      4

      5

      參-

      寫成下面這樣,看起來沒有問題,但若存在重復元素,則可能導致結(jié)果錯誤。

      >>> def find_lucky(arr): return list(filter(lambda x:x==arr.index(x), arr)) >>> find_lucky([1, 1, 2, 5]) [2]

      1

      2

      3

      4

      5

      這樣寫才是正確的。

      >>> def find_lucky(arr): return [item[1] for item in filter(lambda x:x[0]==x[1], enumerate(arr))] >>> find_lucky([1, 1, 2, 5]) [1, 2]

      1

      2

      3

      4

      5

      參-

      2的整數(shù)次冪,寫成二進制一定是高位為1其余為0。利用這個特征,很容易判斷一個數(shù)是否是2的整數(shù)次冪。

      >>> def check_pow(num): return num > 0 and num & num-1 == 0 >>> check_pow(256) True

      1

      2

      3

      4

      5

      3 and 4 * 5 or 6

      1

      參-

      20

      1

      z = zip('xyz', (1,2,3)) for i in range(2): for k, v in z: print('%s=%d'%(k,v))

      1

      2

      3

      4

      參-

      x=1 y=2 z=3

      1

      2

      3

      import threading import time def func(): for i in range(5): print(i) time.sleep(1) threading.Thread(target=func).start() time.sleep(3) print('程序結(jié)束')

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      參-

      4

      1

      3 應用題

      3.1 龐大的牛群

      假定你現(xiàn)在養(yǎng)了一頭母牛,它每年元旦都生一頭小母牛。每頭小母牛從四周歲開始,每年元旦也生一頭小母牛。不考慮牛的壽命和生育年限,過了n個元旦之后,你總共擁有多少頭牛?

      參-1(5分)

      從第5個元旦開始,每年新增的小牛數(shù)量是4年前的母牛總數(shù),因此過了n個元旦之后牛的數(shù)量,等于4年前的牛的數(shù)量,加上上一個年的牛的數(shù)量。

      >>> def cows(n): if n < 4: return n+1 return cows(n-1) + cows(n-4) >>> cows(5) 7 >>> cows(10) 36 >>> cows(20) 907

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      參-2(5分)

      遞歸雖然簡潔,但未必是最佳選擇。本題的四級參-是一個非線性遞歸,復雜度為遞歸深度的平方,效率很低。其實,同樣的思路,不用遞歸實現(xiàn)的話,速度就會快很多,只是代碼沒有遞歸那么優(yōu)雅。

      >>> def cows(n): if n < 4: return n+1 result = [1,2,3,4] for i in range(4, n+1): result.append(result[0]+result[-1]) result = result[1:] return result[-1] >>> cows(5) 7 >>> cows(10) 36 >>> cows(20) 907

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      3.2 古堡之門

      福爾摩斯到某古堡探險,看到門上寫著一個奇怪的算式:

      ABCDE × G = EDCBA

      1

      他對華生說:“ABCDE應該代表不同的數(shù)字,G也代表某個數(shù)字!”

      華生:“我猜也是!”

      于是,兩人沉默了好久,還是沒有算出合適的結(jié)果來。

      請利用計算機的優(yōu)勢,找到破解的答案。

      參-1(3分)

      中規(guī)中矩的寫法,代碼結(jié)構(gòu)存在改進空間。

      >>> def cbble(): for i in range(10000, 100000): a, quotient = divmod(i, 10000) b, quotient = divmod(quotient, 1000) c, quotient = divmod(quotient, 100) d, e = divmod(quotient, 10) parts =set([a,b,c,d,e]) if len(parts) == 5: for j in range(1, 10): k = 10000*e + 1000*d + 100*c + 10*b +a if j not in parts and i*j == k: print('%d x %d = %d'%(i, j, k)) break >>> cbble() 21978 x 4 = 87912

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      參-2(5分)

      追求結(jié)構(gòu)的優(yōu)美甚于追求更高的效率,盡管不是最佳選擇,但對于此問題卻是合適的。

      >>> def cbble(): for i in range(10000, 100000): a,b,c,d,e = map(int, str(i)) parts =set([a,b,c,d,e]) if len(parts) == 5: k = 10000*e + 1000*d + 100*c + 10*b +a for j in range(1, 10): if j not in parts and i*j == k: return('%d x %d = %d'%(i, j, k)) return '此題無解!' >>> cbble() '21978 x 4 = 87912'

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      3.3 二維列表轉(zhuǎn)置

      嚴格講,Python的列表并沒有維度的概念。這里說的二維列表是指類似下面這樣的列表。

      [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]

      1

      2

      3

      請實現(xiàn)二維列表的轉(zhuǎn)置(行列互換,首行變首列,尾行變尾列,如下所示)。

      [ [1, 4, 7], [2, 5, 8], [3, 6, 9] ]

      1

      2

      3

      參-1(3分)

      不考慮檢查列表是否滿足轉(zhuǎn)置的條件(列表每個元素都是長度相等的列表),初級程序員根據(jù)第一直覺寫出來的代碼幾乎都是這樣的。

      >>> def transpose(arr): result = list() for j in range(len(arr[0])): result.append(list()) for i in range(len(arr)): result[j].append(arr[i][j]) return result >>> transpose([[1,2,3], [4,5,6], [7,8,9]]) [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      參-2(5分)

      作為中高級程序員必然掌握使用一顆星(*)和兩顆星(**)的魔法,內(nèi)置函數(shù)用起來更是得心應手。

      >>> def transpose(arr): return list(zip(*arr)) >>> transpose([[1,2,3], [4,5,6], [7,8,9]]) [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

      1

      2

      3

      4

      5

      3.4 用print函數(shù)畫圓

      使用print()函數(shù)打印星號,形成一個近似的圓。考慮到在文本顯示模式下字符的寬高不相等,以及字符水平間距和行間距不相等等因素,可以在水平方向重復字符以保持合適的看高比例。

      參-(5分)

      優(yōu)秀的程序員數(shù)學至少要及格才行。畫圓,得先計算出圓上個點的位置。通常要借助于參數(shù)方程,比如,令角度變量theta從0°變到360°,對應每個theta,圓上點坐標為:

      x = R * cos(theta) y = R * sin(theta)

      1

      2

      理解了這個思路,下面的代碼就很容易看懂了。三角函數(shù)來自Python的標準模塊math,該模塊還包括度和弧度互轉(zhuǎn)等很多數(shù)學函數(shù)。代碼中的

      >>> import math >>> def print_circle(r, k): # r為半徑,k為寬高比矯正系數(shù) theta = range(0,360,5) x = [round(r*math.cos(math.radians(i))+r) for i in theta] y = [round(r*math.sin(math.radians(i))+r) for i in theta] dots = set(zip(x,y)) for i in range(2*r+1): for j in range(2*r+1): if (i,j) in dots: print('*'*k, sep='', end='') else: print(' '*k, sep='', end='') print() >>> print_circle(5, 3) *************** ****** ****** *** *** *** ****** *** *** *** *** *** *** *** *** *** *** ****** ****** ***************

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      3.5 約瑟夫環(huán)

      從1開始的n個連續(xù)整數(shù)順時針組成n個元素的環(huán)形隊列,從元素1開始沿順時針方向計數(shù),將第m個元素剔除隊列,緊接著從下一個元素重新開始計數(shù),將第m個元素剔除隊列……直至隊列剩余一個元素,并返回該元素的值。

      參-(5分)

      >>> def joseph(n, m): queue, start = list(range(1, n+1)), 0 while len(queue) > 1: start = (m+start-1)%len(queue) queue.pop(start) return queue[0]

      1

      2

      3

      4

      5

      6

      3.6 撲克牌中的順子

      從撲克牌中隨機抽5張牌,判斷是不是順子,即這5張牌是不是連續(xù)的。2~10為數(shù)字本身,A為1,J為11,Q為12,K為13,大小王用0表示,可代表任意數(shù)字。

      參-(5分)

      本題有兩個環(huán)節(jié):

      從撲克牌中隨機抽5張牌

      隨機取牌,可以使用Python的內(nèi)置模塊random中的sample()方法,該方法可以隨機地從指定列表中提取出多個不同的元素。

      判斷是不是順子

      將5張牌換成對應數(shù)字,剔除0后排序。若是順子的話,前后元素之差均為1。若不是1,同時超過1的總和大于0的個數(shù),則不是順子,否則為順子。

      >>> import random >>> import numpy as np >>> def get_five(): poker = list(range(1,14))*4 + [0,0] # 生成54張撲克牌 return random.sample(poker, 5) >>> def is_straight(five): no_zero = list(filter(lambda x:x>0, five)) # 剔除0 if len(no_zero) > len(set(no_zero)): # 如有重復 return False # 則不是順子 no_zero.sort() # 非零元素排序 no_zero = np.array(no_zero) # 轉(zhuǎn)為numpy數(shù)組 diff = np.diff(no_zero) # diff為相鄰元素的差組成的數(shù)組 if np.sum(diff - 1) > 5-no_zero.size: # 若diff各元素減1后的和大于0的個數(shù) return False # 則不是順子 else: return True >>> def test(n): # 測試函數(shù) for i in range(n): five = get_five() if is_straight(five): print(five) >>> test(100) # 測試100次 [12, 10, 11, 0, 8] [5, 1, 0, 3, 2] [10, 6, 0, 7, 9]

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      3.7 青蛙上臺階

      青蛙每次至少可以跳上一層臺階,最多可以跳上兩個臺階,計算青蛙跳上N層臺階總共有多少種方式。

      參-1(5分)

      跳一層只有一種方法,跳兩層則有兩種方法。要跳到K層,可以先跳到K-1層后再跳一次邁上一層,也可以先跳到K-2層后再一步跳上兩層。顯然,跳到K層的方法數(shù)量等于跳到K-1層的方法數(shù)量加上跳到K-2層的方法數(shù)量。基于這個推理,很容易寫出遞歸代碼。

      >>> def climb(n): if n == 1: return 1 elif n == 2: return 2 else: return climb(n-1) + climb(n-2) >>> climb(10) 89

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      參-2(5分)

      遞歸方法雖然簡潔,但會受遞歸深度限制,無法計算超過遞歸深度的數(shù)值。其實,不使用遞歸,代碼寫起來也很簡答。

      >>> def climb(n): if n == 1: return 1 elif n == 2: return 2 c1, c2 = 1, 2 for i in range(2,n): c1, c2 = c2, c1+c2 return c2 >>> climb(10) 89

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      3.8 24點游戲

      幾乎每個人都玩過24點游戲,規(guī)則也很簡單:任意給出4個數(shù)字(視難度不同,一般是10以內(nèi)或13以內(nèi)的數(shù)字,允許重復),每個數(shù)字只能且必須使用1次,利用加減乘除四則運算,使得計算結(jié)果為24。例如,4個數(shù)字分別為5,5,5,1,則有(5-1/5)*5 = 24。請用代碼解決24點問題,若有解,則打印解,若無解,則打印無解。

      參-(5分)

      不考慮計算順序的話,4個數(shù)字使用4種運算符連接的話,共有443424=1536種組合。若考慮使用括號改變計算順序,則前述每一種組合又可分為11種情況。遍歷全部153611=16896種組合,即可解決問題。另外,書寫代碼時如果使用內(nèi)置的排列函數(shù)(permutations)和笛卡爾積函數(shù)(product),會使代碼更簡練。

      >>> from itertools import permutations, product >>> def game24(n1,n2,n3,n4): for a,b,c,d in permutations((n1,n2,n3,n4),4): for o1,o2,o3 in product(['+','-','*','/'], repeat=3): # 笛卡爾積的另一種寫法 cases = list() cases.append('%d%s%d%s%d%s%d'%(a,o1,b,o2,c,o3,d)) cases.append('(%d%s%d)%s%d%s%d'%(a,o1,b,o2,c,o3,d)) cases.append('%d%s%d%s(%d%s%d)'%(a,o1,b,o2,c,o3,d)) cases.append('%d%s(%d%s%d)%s%d'%(a,o1,b,o2,c,o3,d)) cases.append('(%d%s%d)%s(%d%s%d)'%(a,o1,b,o2,c,o3,d)) cases.append('(%d%s%d%s%d)%s%d'%(a,o1,b,o2,c,o3,d)) cases.append('((%d%s%d)%s%d)%s%d'%(a,o1,b,o2,c,o3,d)) cases.append('(%d%s(%d%s%d))%s%d'%(a,o1,b,o2,c,o3,d)) cases.append('%d%s(%d%s%d%s%d)'%(a,o1,b,o2,c,o3,d)) cases.append('%d%s((%d%s%d)%s%d)'%(a,o1,b,o2,c,o3,d)) cases.append('%d%s(%d%s(%d%s%d))'%(a,o1,b,o2,c,o3,d)) for expression in cases: try: # 捕獲表達式中分母為0的異常 if eval(expression) == 24: print('答案:%s = 24'%expression) return except: pass print('無解!') >>> game24(5,5,5,1) 答案:5*(5-1/5) = 24 >>> game24(1,3,4,6) 答案:6/(1-3/4) = 24 >>> game24(10,10,4,4) 答案:(10*10-4)/4 = 24 >>> game24(7,7,3,3) 答案:7*(3/7+3) = 24 >>> game24(1,5,7,10) 答案:(1+7/5)*10 = 24 >>> game24(15,25,37,80) 無解!

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      3.9 背包問題

      在一款英雄對戰(zhàn)游戲中,玩家擁有m件裝備和n位英雄,他可以給每一位英雄分配0件或多件裝備,而不同的英雄擁有不同數(shù)目的裝備時將獲得不同的攻擊力。玩家如何分配這m件裝備,可以使得n個英雄獲得的攻擊力的和最大?以玩家擁有5件裝備和3位英雄為例,列表p共有3行6列,對應著3位英雄分別擁有從0到5件裝備時的攻擊力。

      p = [ [0, 1, 3, 5, 7, 9], [0, 1, 1, 3, 3, 7], [0, 3, 4, 5, 6, 7] ]

      1

      2

      3

      4

      5

      參-(5分)

      這是一個背包問題的變形。即便不熟悉背包問題,也不難找到解題思路:

      找出所有可能的裝備分配方案

      計算每一個方案的攻擊值

      選擇攻擊值最大的分配方案

      找出將m件裝備分配給n位英雄的所有方案是解決問題的核心。

      >>> def bag(m, n, result, series=list()): if n == 1: for i in range(m+1): result.append(series+[i]) #print(result[-1]) else: for i in range(m+1): bag(m-i, n-1, result, series+[i]) >>> result = list() >>> bag(5, 3, result) # 將5件裝備分配給3位英雄,共有56種分配方案 >>> p = [ [0,1,3,5,7,9], [0,1,1,3,3,7], [0,3,4,5,6,7] ] >>> v = list() >>> for item in result: # 計算每一種方案的攻擊值 v.append(p[0][item[0]] + p[1][item[1]] + p[2][item[2]]) >>> max(v) # 最大攻擊值是10 10 >>> result[v.index(max(v))] # 最佳分配方案 [4, 0, 1] # 第1位英雄持有4件裝備,第2位英雄沒有裝備,第3位英雄持有1件裝備。

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      3.10 空間直線相交問題

      ABCD是歐氏空間中不重合的四個點,判斷過點AB的直線和過點CD的直線是否相交。

      參-(5分)

      假如使用空間解析幾何的方式,這個問題對于程序員來說是一個難題。不過,如果你熟悉NumPy,理解點積(np.dot)和叉積(np.cross)的話,解決這個問題就變得非常容易了。

      計算向量ab和向量cd的叉積,得到一個新的向量orth

      若向量orth的元素全部為零,則兩直線平行,否則向量orth必定同時垂直于向量ab和向量cd

      直線相交,則向量ac和向量orth的點積為零,否則直線必定不相交

      >>> import numpy as np >>> def is_orthogonal(a, b, c, d): ab = np.array(a) - np.array(b) cd = np.array(c) - np.array(d) ac = np.array(a) - np.array(c) orth = np.cross(ab,cd) return orth.any() and np.dot(orth, ac) == 0 >>> a,b,c,d = (0,0,0),(1,0,0),(0,0,0),(0,1,0) >>> is_orthogonal(a, b, c, d) True >>> a,b,c,d = (0,0,0),(1,0,0),(0,0,1),(0,1,1) >>> is_orthogonal(a, b, c, d) False

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      HTTP Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:一文入門ETCD
      下一篇:C語言學習,這一篇就夠了!(一)
      相關(guān)文章
      日韩精品亚洲人成在线观看| yy6080久久亚洲精品| 久久亚洲高清综合| 久久久久久亚洲av无码蜜芽| 亚洲午夜精品一区二区麻豆| wwwxxx亚洲| 亚洲成A人片在线播放器| 国产精品亚洲午夜一区二区三区| 亚洲日本在线免费观看| 亚洲乱码中文字幕小综合| 亚洲成a人片在线观| 亚洲一区二区三区深夜天堂| 亚洲人成电影在线观看网| 久久精品亚洲AV久久久无码| 亚洲图片校园春色| 亚洲AV无码乱码麻豆精品国产| 亚洲日本人成中文字幕| 亚洲综合小说另类图片动图| 亚洲午夜理论片在线观看| 亚洲av日韩专区在线观看| 国产成人亚洲精品91专区高清| 亚洲AV无码XXX麻豆艾秋| 国产成人亚洲精品蜜芽影院| 五月天婷亚洲天综合网精品偷| 亚洲国产激情一区二区三区| 亚洲男女内射在线播放| 亚洲日韩一页精品发布| 亚洲AV无码久久寂寞少妇| 亚洲一区二区三区日本久久九| 亚洲精品国产肉丝袜久久| 亚洲色图在线播放| 亚洲欧洲国产精品久久| 亚洲av乱码一区二区三区| 亚洲乱码国产乱码精华| 亚洲国产成人久久精品99| 久久亚洲欧洲国产综合| 亚洲成AV人片在线观看无| 91精品国产亚洲爽啪在线影院| 亚洲专区一路线二| 久久亚洲AV成人无码国产电影| 亚洲av再在线观看|