2023 年 6 月 GESP Python 二級試卷解析
一、單選題(每題 2 分 ,共 30 分)
1 、 高級語言編寫的程序需要經過以下( )操作,可以生成在計算機上運行的可執行代碼。
A. 編輯
B. 保存
C. 調試
D. 編譯
【答案】D
【解析】本題考察考生對程序設計語言中高級語言特點的了解,編譯是把高級語 言轉換成可執行代碼,使得程序能夠在計算機上運行的過程;調試是指在程序開 發過程中,找出并修復錯誤和問題的過程。
2 、 能夠實現下面流程圖功能的偽代碼是( )。
A. if 條件判斷 then 語句塊
B. if 條件判斷 then 什么也不做 else 語句塊
C. while 條件判斷 do 語句塊
D. while not 條件判斷 do 語句塊
【答案】D
【解析】本題主要考察流程圖的使用,圖中表示的是條件判斷,成立的時候不執 行,而不成立時執行語句塊,并且執行完語句塊后再次進行條件判斷,這是一個 循環的過程,而 A 選項,表示的是如果…那么…結構,B 選項是如果…那么… 否則結構,C 選項是循環,但是是條件成立的時候執行語句塊,和流程圖正好相 反,所以本題選擇 D 選項。
3 、 在 Python 代碼中,變量 a 的值為 4 ,則表達式 5<a<20 的值是( )。
A. true
B. false
C. True
D. False
【答案】D
【解析】本題考察的是一種組合比較運算符的使用,用于判斷變量a 的值是否在 5-20 之間,如果在結果為 True,不在結果為 False,需要注意的是,布爾值 True 和 False 的首字母大寫。這里變量a 的值為 4,是不在 5-20 之間的,所以結果 為 False,D 選項。
4 、 Python 表達式 round(8/3,3)的值是( )。
A. 2
B. 3
C. 2.667
D. 2.666
【答案】C
【解析】本題考察的是數學函數之四舍五入 round()函數的使用,round 函數里 有兩個參數,第一個參數是需要四舍五入的數字,第二個參數是保留的小數位數
(默認為 0,表示保留到整數位)。本題中對 8/3 的結果保留三位小數, 8/3=2.666666666666666…,保留三位的結果是 2.667,故此題選 C。
5 、 下面 Python 代碼執行后輸出是( )。
A. -6
B. -5
C. 0
D. 報錯
【答案】A
【解析】本題考察的是 python 數學庫中的向下取整 floor()函數,它的作用是 返回不大于指定數字的最大整數。這個題目中是對-5.67 向下取整,不大于-5.67 的最大數字為-6,故此題選 A。
6 、 下面 Python 代碼執行后的輸出是( )。
A. 3,2
B. 2,3
C. 3,3
D. 2,2
【答案】D
【解析】本題首先考察的是 python 下多重賦值的一種方法,用于同時給多個變 量賦值,本題中,左邊的變量 a 和 b 分別和右邊的元素進行匹配賦值,即 a 被賦 值為 3,b 被賦值為 2。然后考察分支語句中的 if 語句,表示如果…,當 if 后 的條件為True 時,if 語句下面縮進的代碼塊將被執行,本題中a>b 是成立的, 所以會執行下面的兩行代碼,變量 a 被重新賦值為b,即 a=2,然后b=a,此時a 的值為 2,所以 b=2。最后通過 print()函數輸出出來,添加了 sep 參數,所以 a 和 b 之間的值會以逗號隔開,故此題選 D。
7 、 下面 Python 代碼執行后的輸出是( )。
B. 4
C. 3
D. 0-2
【答案】A
【解析】 本題主要考察 Python 中多分支結構的使用,if…elif…else…結 構,表示“如果…否則如果…否則… ”,這種結構可以根據不同條件的真假 選擇執行不同的代碼塊,不過,當多個條件中有一個條件能夠成立時,不再進行 其他條件的判斷。本題中變量 z=13%5,%表示取余,那么 z=3,滿足第一個條件 z<5,執行 print(5)后結束判斷,故正確答案為 A 選項。
8 、 下面 Python 代碼執行后的輸出是( )。
A. 15
B. 10
C. 5
D. 0
【答案】B
【解析】本題考察了考生對 python 中 for 循環嵌套結構的理解,在每一次外層 循環執行過程中,內層循環會完整地執行一次。本題中,變量 cnt用來計數,通 過雙層循環來累加其值,外層循環 i 的范圍是從 0 到 4,每次內層循環 j 的范圍 是從 0 到 i-1。執行過程如下:
(1) 當 i 等于 0 時,內層循環不會執行;
(2) 當 i 等于 1 時,內層循環執行一次,j 的范圍是 range(1),即 0,所以 cnt 的值增加 1;
(3) 當 i 等于 2 時,內層循環執行兩次,j 的范圍是 range(2),即 0 和 1, 所以 cnt 的值增加 2;
(4) 當 i 等于 3 時,內層循環執行三次,j 的范圍是 range(3),即 0、1 和 2,所以 cnt 的值增加 3。
(5) 當 i 等于 4 時,內層循環執行四次,j 的范圍是 range(4),即 0、1、2 和 3。所以 cnt 的值增加 4;
因此,最后 cnt 的值為 1+2+3+4=10。
9 、 求 m 到 n 之間的間隔數數量,m 可能大于 n ,如 3 到 6 之間間隔數數量為 2,6 和 3 之 間的間隔數同樣是 2 。根據上述題意,在 Python 代碼橫線處應填上( )。
A. gap = 1
B. gap = 0
C. gap = -1
D. gap = gap
【答案】C
【解析】本題考察了考生對 for 循環中range()函數中的三個參數的理解,這三 個參數分別表示起始值、終止值和步長,取出的數字從起始值開始,到終止值-1 結束,每次迭代增加或減少步長的值。當步長為正數時,起始值必須小于終止值; 而當步長為負數時,起始值必須大于終止值,否則,循環無法進行。在本題中, for 循環中的起始值為m+1,終止值為 n,步長為 gap,當 m>n 時,步長 gap 是負 數才可以取到值,所以本題選擇 C 選項。
10 、 正整數 N 除以 16 的余數為 0-15,將 0-15 對應為不同字符,0-9 仍然為 0-9, 10-15依次對應為大寫應為字母 A-F 。根據上述題意,在 Python 代碼橫線處應填上( )。
A. chr(ord(“A”))+Remainder-10
B. chr(ord(“A”) +Remainder)
C. chr(Remainder)
D. chr(ord(“A”) +Remainder-10)
【答案】D
【解析】本題主要考察的是ASCII碼和字符之間的轉換,ord()函數用于返回給 定字符的ASCII值或 Unicode 值,括號里的參數是一個字符,返回值為該字符對 應的整數值。例如,ord(‘A’)返回 65,ord(‘a’)返回 97。而 chr()函數則相反, 括號里的參數是一個整數值,返回值為該整數值對應的字符。例如,chr(65)返 回字符’A’,chr(97)返回字符’a’。
本題中,N 是用戶輸入的正整數,Remainder 是 N 除以 16 的余數,根據題目要求, 如果余數小于 10,即為 0-9 時,直接打印該余數(轉換為字符串形式),否則 需要將余數轉換為對應的大寫字母 A-F。
D選項 chr(ord(“A”)+Remainder-10)中,先將大寫字母A 的ASCII值通過 ord(“A”) 獲取到,然后加上余數,比如當余數是 11 時,對應的字母是 B,和 A 相比,ASCII 值差了一個 1,所以加上余數 11 之后,又減掉了一個偏移量 10,這樣再通過 chr() 函數就可以得到對應的字符。
11 、 下面 Python 代碼執行后的輸出是( )。
A. 55
B. 18
C. 9
D. 33
【答案】C
【解析】本題主要考察的是考生對雙層 for 循環的嵌套以及 break 語句的理解。 這道題目中有兩個嵌套的 for 循環,外層循環的變量為 i,范圍為 0 到 9,i 每 取到一個值時,進入到里層循環,而里層循環的變量也為 i,范圍為 range(i), 即 0 到 i-1,在每次內層循環中,我們首先檢查條件 if i % 2,即判斷 i 是否為 奇數,如果是奇數,那么我們執行 break 語句跳出內層循環,不是奇數時,我們 執行 cnt += 1 將 cnt 的值增加 1。
(1) 外層循環中,第一次 i=0,內層循環不會執行;
(2) 外層循環中,第二次 i=1,進入到里層循環,里層 i 的范圍是 range(1), 即 0,此時 i 不是奇數,執行 cnt+=1。執行完 cnt=1;
(3) 外層循環中,第三次 i=2,進入到里層循環,里層 i 的范圍是 range(2), 即 0 和 1。i 等于 0 時不是奇數,執行 cnt+=1。下一輪里層 i 等于 1,是 奇數,執行 break 語句跳出內層循環。執行完 cnt=2;
(4) 外層循環中,第四次 i=3,進入到里層循環,里層 i 的范圍是 range(3), 即 0、1 和 2。i 等于 0 時不是奇數,執行 cnt+=1。下一輪里層 i 等于 1, 是奇數,執行 break 語句跳出內層循環。執行完 cnt=3;
(5) 外層循環中,第五次 i=4,進入到里層循環,里層 i 的范圍是 range(4), 即 0、1、2 和 3。i 等于 0 時不是奇數,執行 cnt+=1。下一輪里層 i 等于 1,是奇數,執行 break 語句跳出內層循環。執行完 cnt=4;
……
后面每次都是如此,所以最終結果 cnt=9,所以本題選擇 C 選項。
12 、 有關下面 Python 代碼執行的說法,正確的是( )。
A. 代碼執行后如果輸入 5 ,則將輸出 5
B. 代碼執行后如果輸入 5 ,則將再輸入 5 次,輸出由先后輸入值決定
C. 代碼輸入執行后如果不輸入小于 0 的數,將無限循環
D. 代碼執行將報錯。
【答案】A
【解析】本題考查考生對 for 循環中range()參數的理解。程序運行后,會等待 用戶輸入一個值,輸入完成后,會將輸入的數字轉換為整數類型,并把這個整數 作為參數傳遞給 range()函數,用于創建一個范圍對象,此時 for 循環的范圍就 確定下來了,之后變量 i 會依次取范圍對象中的值,從 0 開始遞增,直到范圍對 象的最大值(用戶輸入的值-1)為止。每次循環中,cnt += 1 語句會執行一次, 即將 cnt 的值增加 1。這樣實現了一個根據用戶輸入的值,執行循環并統計循環 的次數的效果。
A 和 B 選項中,輸入 5,范圍確定即為 range(5),執行 5 次,最后輸出 5,所以 A 選項正確,B 選項錯誤。C 選項中,不輸入小于 0 的數字,即輸入大于等于 0 的數字時,輸入的是幾,執行幾次,輸出的也是幾,所以C 選項也錯誤。
13 、 兩個正整數的最大公約數是指能被兩個數都整除且最大,如 12 和 18 能被 2 、3 和6 整除,但 6 最大,所以 12 和 18 的最大公約數是 6。兩個質數如 13 和 17 的最大公約 數是 1 。根據上述題意,在 Python 代碼橫線處應填上( )。
A. range(m, 0, -1)
B. range(m)
C. range(m, 1, -1)
D. range(1, m)
【答案】A
【解析】本題考查的是考生對最大公約數的理解和 for 循環 range()參數的設置 以及 break 語句的作用。這段代碼求最大公約數,指的是能被兩個數都整除且最 大的那個數,根據代碼,是找到一個能夠整除的數之后執行 break 語句,即終止 了循環,此時找到的一定是一個最大的公約數,說明是倒著取數,所以范圍是從 m 到 0(0 取不到),并且步長為-1。C 選項中范圍是從 m 到 1,此時 1 取不到,所 以本題選擇 A 選項。
14 、 產生 m 和 n 之間的隨機整數,包括 n 和 m 。根據上述題意,在 Python 代碼橫線
處應填上( )。
A. m + 1 + int((n - m) * random.random())
B. m + 1 + int((n - m) * random.random)
C. m + 1 + int((n - m)) * random.random
D. m + 1 + (n - m) * int(random.random())
【答案】A
【解析】本題考查考生對 random 隨機庫以及題目的理解,random.random()生成 一個 [0, 1) 范圍內的隨機小數,B 選項和C 選項沒有括號,所以錯誤;D 選項 中 int(random.random())的結果始終為 0,乘以(n-m)結果還是 0,再加上 m+1, 取到的值始終是輸入的兩個數中較小的數加 1,所以D 選項錯誤;A 選項中,先 計算 n 和 m 的差值(n - m),然后使用 random.random()生成一個[0, 1) 范圍內 的隨機小數。將這個隨機小數乘以差值得到一個[0, n - m)范圍內的隨機小數, 再將其轉換為整數類型,最后,將得到的隨機整數與m + 1 相加,便可以得到一 個在 m 和 n 之間的整數,所以本題選擇 A 選項。
15 、 下面 Python 代碼執行后輸出“OK”( )行。
A. 0
B. 12
C. 18
D. 20
【答案】C
【解析】本題主要考察考生對 for 循環中range()參數以及 for 循環中變量的范 圍的理解,外層循環中范圍是 range(8,2,-2),表示從 8 開始,到 2 的前一個數 結束,每取一個數字減 2,即依次取出 8、6 和4;里層循環中range()的參數有 一個,為 i,即依次為 8、6 和 4,表示分別執行了 8 次、6 次和 4 次,共 18 次, 所以輸出 OK 18 行,所以本題選擇 C 選項。
二、判斷題(每題 2 分 ,共 20 分)
1. 誕生于 1986 年的中華學習機 CEC-I 入選了 2021 年的 CCF 計算機歷史記憶(一類), 它的內存只有 64KB。當時的漢字編碼字符集 GB2312 中共有 6763 個漢字,假如每個漢 字用 2 個字節編碼,將整個 GB2312 漢字字符集都放入 CEC-I 的內存,也只占用了不超 過 1/5 的內存空間。
【答案】錯誤
【解析】本題主要考察計算機基礎知識的內容。1KB=1024 字節,那么 64KB = 64 * 1024 = 65536 字節,而 6763 個漢字,每個漢字占用 2 個字節,總共需要的字 節數為 6763 * 2 = 13526 字節, 占用的內存空間超過了 1/5 的內存空間。
2. 域名是由一串用點分隔的名字來標識互聯網上一個計算機或計算機組的名稱,CCF 編程 能力等級認證官方網站的域名是 gesp.ccf.org.cn ,其中頂級域名是 gesp。
【答案】錯誤
【解析】本題主要考查計算機基礎的知識。頂級域名指的是最右邊的字符組,通 常用于表示國家、地區、組織或類型等信息。在給定的域名 “g esp.ccf.org.cn” 中,頂級域名是 “cn”,表示中國。所以本題錯誤。
3. Python 表達式 5.0//2 的值為整數 2。
【答案】錯誤
【解析】本題考查 Python 算術運算符中//運算符的使用。//表示向下取整,當 //左右都是整數時,結果是一個整數類型,而當//左右有一個浮點數時,結果為 浮點數類型。5.0//2 的值為浮點數 2.0,所以本題錯誤。
4. 執行 Python 代碼 a=f’ {101:2.2f}'后,變量 a 的類型為 float ,其值 101.00。
【答案】錯誤
【解析】本題考查格式化字符串的內容。f’ {101:2.2f}’ 使用的是 f-string 格 式化字符串的方法,結果是一個字符串類型,不是 float。所以本題錯誤。
5. 當 Python 執行循環時,如果執行到 break 語句,這終止其所在循環。
【答案】正確
【解析】本題考查考生對 break 語句的理解。在循環執行過程中,遇到break 語句時,會立即終止所在的循環,不再執行循環內的剩余代碼,而是跳出循環, 繼續執行循環后面的代碼。所以本題正確。
6. 執行以下 Python 代碼,如果 n 值為負整數,將輸出 0。
【答案】錯誤
【解析】本題主要是對 while 循環中條件表示方式的考察。當 while 后跟整數的 情況下,當數字為 0 時,不會進入循環,否則表示無限循環。當輸入的 n 為負整 數時,進入循環,變量 n 每次減 1,會越來越小,會進入無限循環,所以本題錯 誤。
7. 執行以下 Python 代碼,將輸出π 的值。
【答案】錯誤
【解析】本題考查數學庫math 的相關知識點。 π是數學庫math 中的一個常量, 用 math.pi 表示,不用加括號,所以本題錯誤。
8. Python 是一種低級語言,適合初學者程序設計入門。
【答案】錯誤
【解析】本題屬于對程序設計語言的考察。Python 屬于高級語言之一,所以本 題錯誤。
9. {1, 1}在 Python 中是合法的表達式。
【答案】正確
【解析】本題是對 Python 下常見數據類型的考察。{1,1}是集合 set 的表示形式, 不過集合是由不重復的元素組成的,如果定義一個變量 a={1,1},定義完成后 a={1}。
10. 以下 Python 代碼執行時將報錯,因為 a 初始被賦值為整數,隨后將其賦值為字符串, 故錯誤。
【答案】錯誤
【解析】本題主要是對變量賦值的考察。第一次賦值,變量a=123,第二次賦值, 變量a= ”ABC ”,第二次賦值會覆蓋第一次的值,運行時不會報錯,所以本題錯 誤。
三、編程題
第 1 題
【問題描述】
小明剛剛學習了素數的概念:如果一個大于 1 的正整數,除了 1 和它自身外,不能被 其他正整數整除,則這個正整數是素數。現在,小明想找到兩個正整數 A 和 B 之間(包括 A 和 B)有多少個素數。
【輸入描述】
輸入 2 行,第一行包含正整數 A ,第二行包含正整數 B 。約定 2≤A≤B≤1000。
【輸出描述】
輸出一行,包含一個整數 C ,表示找到 C 個素數。
【樣例輸入 1】
2
10
【樣例輸出 1】
4
【樣例解釋 1】
在 2 和 10 之間有 4 個素數,分別為:2 、3 、5 、7。
【樣例輸入 2】
98
100
【樣例輸出 2】
0
【題目大意】
求素數個數問題,輸入兩個數字,依次判斷這兩個數字之間的每一個數是否為素 數,即找到除了 1 和它自身外,不能被其它正整數整除的的數字。
【解題思路】
本題主要考察多層 for 循環的嵌套使用。
- 首先輸入兩個數字,借助 for 循環,表示出這兩個數字之間的每一個數。
- 每取到一個數,判斷這個數字是否為素數,再借助一個 for 循環,表示出判 斷的范圍,要找的是除了 1 和它本身之外的,如果有能夠整除的,說明不是素數, 否則是素數。
- 設置變量,記錄素數的個數。
- 按照要求完成輸出。
【參考程序】
A = int(input()) # 輸入第一個數
B = int(input()) # 輸入第二個數
count = 0 # 記錄素數個數for num in range(A, B + 1):is_prime = True # 標記是否為素數# 檢查從2到num-1的數是否能整除numfor i in range(2, num):if num % i == 0:is_prime = False # 不是素數break # 無需繼續檢查if is_prime:count += 1 # 是素數則計數加1print(count)
第 2 題
【問題描述】
-
判斷一個正整數是否為自冪數;
-
自冪數是指 N 位數各位數字 N 次方之和是本身,如 153 是 3 位數,其每位數的 3 次方之和是 153 本身,因此 153 是自冪數,1634 是 4 位數,其每位數的 4 次方之 和是 1634 本身;
-
首先輸入一個整數 M 表示隨后有 M 行每行有一個整數,輸出每個整數是否為自冪 數,如是則輸出 T ,否則 F。
【輸入描述】 -
輸入正整數 M(1 < = M < = 100)。不考慮輸入不合規情形如負數、負整數、零或 其他字符串等;
-
從第 2 行開始,輸入 M 行每行一個正整數(1 < = M < = 2147483647);
-
特別提示:常規程序中,輸入時好習慣是有提示。考試時由于系統限定,輸入時所 有 input()函數不可有提示信息。
【輸出描述】
- 輸出對應正整數是否為自冪數,如是則輸出一個英文字母 T ,否則一個英文字母 F;
- 特別提示:注意輸出字母為大寫,小寫將判為錯誤,前后沒有空格等。
【樣例輸入 1】
3
152
111
153
【樣例輸出 1】
F
F
T
【樣例輸入 2】
5
8208
548834
88593477
12345
5432
【樣例輸出 2】
T
T
T
F
F
【題目大意】
查找自冪數個數問題,輸入 M 個數字,依次判斷是否是自冪數
【解題思路】
本題主要考察輸入固定個數字以及對于一個數字依次獲取各位上的數的內容。
- 首先輸入數據的數量 N
- 執行 N 次,每次輸入一個數字,求出這個數字各位冪次方的和。
- 判斷是否是自冪數,按照要求完成輸出。
【參考程序】
#自冪數
N = int(input()) # 輸入數據的數量
for i in range(N):M = int(input()) # 輸入判斷的數# 處理特殊情況:1是自冪數if M == 1:print("T")continue# 獲得輸入整數的位數howDigit = 0tmp = Mwhile tmp != 0:howDigit += 1tmp //= 10 # 執行完本步,tmp將減少1位# 計算各位冪次方的和tnt = 0tmp = Mwhile tmp != 0:tnt += (tmp % 10) ** howDigittmp //= 10# 判斷是否為自冪數if tnt == M:print("T")else:print("F")