點擊此處進入原試題
一、單項選擇題(共15題,每題2分,共計30分;每題有且僅有一個正確選項)
1.中國的國家頂級域名是?
A.cn B.ch C.chn D.china
【答案】A
2.二進制數11 1011 1001 0111和01 0110 1110 1011 進行邏輯與運算的結果是?
A. 01 0010 1000 1011 B. 01 0010 1001 0011
C. 01 0010 1000 0001 D. 01 0010 1000 0011
【答案】D
【解析】
3.一個32位整型變量占用的字節數是?
A.32 B.128 C.4 D.8
【答案】C
【解析】32÷8=4(字節)
4.若有如下程序段,其中s、a、b、c均已定義為整型變量,且a、c均已賦值(c大于0):
s=a;
for(b=1;b<=c;b++)s=s-1;
則與上述程序段功能等價的賦值語句是?
A.s=a-c; B.s=a-b; C.s=s-c; D.s=b-c;
【答案】A
5.設有100個已排好序的數據元素,采用折半查找時,最大比較次數為?
A.7 B.10 C.6 D.8
【答案】 A
【解析】
6.鏈表不具有的特點是?
A. 插入刪除不需要移動元素 B.不必事先估計存儲空間
C.所需空間與線性表長度成正比 D.可隨機訪問任一元素
【答案】D
7.7.把8個同樣的球放在5個同樣的袋子里,允許有的袋子空著不放,問共有多少種不同的分法(如果8個球都放在一個袋子里,無論是哪個袋子,都只算同一種分法)?
A.22 B.24 C.18 D.20
【答案】C
【解析】
枚舉:
0,0,0,0,8
0,0,0,1,7
0,0,0,2,6
0,0,0,3,5
0,0,0,4,4
0,0,1,1,6
0,0,1,2,5
0,0,1,3,4
0,0,2,2,4
0,0,2,3,3
0,1,1,1,5
0,1,1,2,4
0,1,1,3,3
0,1,2,2,3
0,2,2,2,2
1,1,1,1,4
1,1,1,2,3
1,1,2,2,2
8.一棵二叉樹如右圖所示,若采用順序存儲結構,即用一維數組元素存儲該二叉樹中的結點(根結點的下標為1,若某結點的下標為i,則其左孩子位于下標2i處、右孩子位于下標2i+1處),則該數組的最大下標至少為?
A.6 B.10 C.15. D.12
【答案】C
【解析】2^4-1=15
- 100以內最大的素數是?
A.89 B.97. C.91 D.93
【答案】B
10.319和377的最大公約數是?
A.27 B.33 C.29 D.31
【答案】C
11.新學期開學了,小胖想減肥,健身教練給小胖制定了兩個訓練方案。方案一:每次連續跑3公里可以消耗300千卡(耗時半小時) ;方案二:每次連續跑5公里可以消耗600千卡(耗時1小時)。小胖每周周一到周四能抽出半小時跑步,周五到周日能抽出一小時跑步。另外,教練建議小胖每周最多跑21公里,否則會損傷膝蓋。請問如果小胖想嚴格執行教練的訓練方案,并且不想損傷膝蓋,每周最多通過跑步消耗多少千卡?
A.3000 B.2500 C.2400 D.2520
【答案】C
【解析】
消耗千卡數與時間成正比。
方案一:
方案二:
為了盡量多消耗千卡,盡量少跑時間,應該盡量多用方案二,每天一小時最多有三天,,剩下
,用方案一,正好可以鍛煉
,綜上,最多消耗
。
12.一副紙牌除掉大小王有52張牌,四種花色,每種花色13張。假設從這52張牌中隨機抽取13張紙牌,則花色一致的牌數至少是?
A.4 B.2 C.3 D.5
【答案】A
【解析】
13.一-些數字可以顛倒過來看,例如0、1、8顛倒過來還是本身,6顛倒過來是9,9顛倒過來看還是6,其他數字顛倒過來都不構成數字。類似的,一些多位數也可以顛倒過來看,比如106顛倒過來是901。假設某個城市的車牌只由5位數字組成,每一位都可以取0到9。請問這個城市最多有多少個車牌倒過來恰好還是原來的車牌?
A.60 B.125 C.75 D.100
【答案】C
【解析】一個五位數倒過來,第一位變到第五位,第五位變到第一位,即第一位倒過來等于第五位,第五位倒過來等于第一位,有0→0、1→1,8→8,6→9,9→6五種情況。同理,第二位和第四位也有五種情況。第三位倒過來還是第三位,也就是只能說0、1、8三種。根據乘法原理,得共有。
14.假設一棵二叉樹的后序遍歷序列為 DGJHEBIFCA ,中序遍歷序列為DBGEHJACIF,則其前序遍歷序列為?
A. ABCDEFGHIJ B. ABDEGHJCFI C. ABDEGJHCFI D. ABDEGHJFIC
【答案】B
【解析】
作出二叉樹的圖:
15.15.以下哪個獎項是計算機科學領域的最高獎?
A.圖靈獎 B.魯班獎 C.諾貝爾獎 D.普利策獎
【答案】C
二、閱讀程序(程序輸入不超過數組或字符串定義的范圍;判斷題正確填√,錯誤填×;除特殊說明外,判斷題1.5分,選擇題3分,共計40分)
#include <cstdio>
#include <cstring>
using namespace std;
char st[100];
int main() {
scanf("%s", st);
int n = strlen(st);
for (int i = 1; i <= n; ++i) {
if (n % i == 0) {
char c = st[i - 1];
if (c >= 'a')
st[i - 1] = c - 'a' + 'A';
}
}
printf("%s", st);
return 0;
}
?判斷題
1.輸入的字符串只能由小寫字母或大寫字母組成。
2.若將第8行的“i = 1”改為“i = 0”,程序運行時會發生錯誤。
3.若將第8行的“i <= n”改為“i * i <= n”,程序運行結果不會改變。
4.若輸入的字符串全部由大寫字母組成,那么輸出的字符串就跟輸入的字符串一樣。
?選擇題
5.若輸入的字符串長度為18,那么輸入的字符串跟輸出的字符串相比,至多有()個字符不同。
A.18 B.6 C.10 D.1
6.若輸入的字符串長度為(),那么輸入的字符串跟輸出的字符串相比,至多有36個字符不同。
A.36 B. C.1 D.128
【答案】
判斷題:×√×√
選擇題:BB
【答案】
判斷題:√×××
選擇題:AA
【解析】
判斷題:
4.15行是否執行要看14行,與13行無關。
選擇題:
1.原來是2n,有m對數被減掉,即2n-2m。
2.只存兩個數,即2n-2。
#include<cstdio>
using namespace std;
int n, m;
int a[100], b[100];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
a[i] = b[i] = 0;
for (int i = 1; i <= m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
if (a[x] < y && b[y] < x) {
if (a[x] > 0)
b[a[x]] = 0;
if (b[y] > 0)
a[b[y]] = 0;
a[x] = y;
b[y] = x;
}
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
if (a[i] == 0)
++ans;
if (b[i] == 0)
++ans;
}
printf("%d", ans);
return 0;
}
假設輸入的n和m都是正整數,x和y都是在的范圍內的整數,完成下面的判斷題和單選題:
?判斷題
1.當時,輸出的值一定小于
。
2.執行完第27行的"++ans"時,ans —定是偶數。
3.a[i]和b[i]不可能同時大于0。
4.右程序執行到第13行時,x總是小于y,那么第15行不會被執行。
?選擇題
5.若m個x兩兩不同,且m個y兩兩不同,則輸出的值為()。
A. B.
C.
D.
6.若m個x兩兩不同,且m個y都相等,則輸出的值為()。
A. B.
C.
D.
【答案】
判斷題:×√
選擇題:B
【解析】
判斷題:
1.當a數組數字重復時,取的是最小值中編號靠前的那個,并不會出錯。
2.f的返回函數永遠是0。
#include <iostream>
using namespace std;
const int maxn = 10000;
int n;
int a[maxn];
int b[maxn];
int f(int l, int r, int depth) {
if (l > r)
return 0;
int min = maxn, mink;
for (int i = l; i <= r; ++i) {
if (min > a[i]) {
min = a[i];
mink = i;
}
}
int lres = f(l, mink - 1, depth + 1);
int rres = f(mink + 1, r, depth + 1);
return lres + rres + depth * b[mink];
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i)
cin >> a[i];
for (int i = 0; i < n; ++i)
cin >> b[i];
cout << f(0, n - 1, 1) << endl;
return 0;
}
?判斷題
1.如果a數組有重復的數字,則程序運行時會發生錯誤。()
2.如果b數組全為0,則輸出為0。()
?選擇題
3.當n=100時,最壞情況下,與第12行的比較運算執行的次數最接近的是:()。
A. 5000 B. 600 C. 6 D. 100
4.當n=100時,最好情況下,與第12行的比較運算執行的次數最接近的是:()。
A. 100 B. 6 C. 5000 D. 600
5.當n=10時,若b數組滿足,對任意0<=i<n,都有b[i] = i + 1,那么輸出最大為()。
A. 386 B. 383 C. 384 D. 385
6.(4分)當n=100時,若b數組滿足,對任意0 S i < 71,都有b[i]=1,那么輸出最小為()。
A. 582 B. 580 C. 579 D. 581
【答案】
判斷題:×√
選擇題:ADDB
【解析】
三、完善程序(單選題,每小題3分,共計30分)
1.(矩陣變幻)有一個奇幻的矩陣,在不停的變幻,其變幻方式為:數字0變成矩陣,數字1變成矩陣
最初該矩陣只有一個元素0,變幻n次后,矩陣會變成什么樣?
例如,矩陣最初為:;矩陣變幻1次后:
矩陣變幻2次后:
輸入一行一個不超過10的正整數n。輸出變幻n次后的矩陣。 試補全程序。
提示:
"<<"表示二進制左移運算符,例如<math><semantics><annotation encoding="application/x-tex">(11)_2 << 2 = (1100)_2</annotation></semantics></math>(11)2?<<2=(1100)2?;而“^”表示二進制異或運算符,它將兩個參與運算的數中的每個對應的二進制位—進行比較,若兩個二進制位相同,則運算結果的對應二進制位為0,反之為1。
#include <cstdio>
using namespace std;
int n;
const int max_size = 1 << 10;
int res[max_size][max_size];
void recursive(int x, int y, int n, int t) {
if (n == 0) {
res[x][y] = ①;
return;
}
int step = 1 << (n - 1);
recursive(②, n - 1, t);
recursive(x, y + step, n - 1, t);
recursive(x + step, y, n - 1, t);
recursive(③, n - 1, !t);
}
int main() {
scanf("%d", &n);
recursive(0, 0, ④);
int size = ⑤;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
printf("%d", res[i][j]);
puts("");
}
return 0;
}
①處應填()
A. n%2 B. 0 C. t D. 1
②處應填()
A. x-step,y-step B. X,y-step C. x-step,y D.x,y
③處應填()
A. x-step,y-step B. x+step,y+step C. x-step,y D. X,y-step
④處應填()
A. n-1,n%2 B. n,0 C. n,n%2 D. n-1,0
⑤處應填()
A. 1<<(n+1) B. 1<<n C. n+1 D. 1<<(n-1)
【答案】CDBBB
【解析】
(計數排序)計數排序是一個廣泛使用的排序方法。下面的程序使用雙關鍵字計數排序,將n對10000以內的整數,從小到大排序。例如有三對整數(3,4)(3,4)、(2,4)(2,4)、(3,3)(3,3),那么排序之后應該是(2,4)(2,4)、(3,3)(3,3)、(3,4)(3,4) 。輸入第一行為nn,接下來nn行,第ii行有兩個數a[i]a[i]和b[i]b[i],分別表示第ii對整數的第一關鍵字和第二關鍵字。從小到大排序后輸出。數據范圍 且
提示:應先對第二關鍵字排序,再對第一關鍵字排序。數組ord[]存儲第二關鍵字排序的結果,數組res[]存儲雙關鍵字排序的結果。
試補全程序。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 10000000;
const int maxs = 10000;
int n;
unsigned a[maxn], b[maxn],res[maxn], ord[maxn];
unsigned cnt[maxs + 1];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%d%d", &a[i], &b[i]);
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < maxs; ++i)
①; // 利用 cnt 數組統計數量
for (int i = 0; i < n; ++i)
cnt[i + 1] += cnt[i];
for (int i = 0; i < n; ++i)
②; // 記錄初步排序結果
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < n; ++i)
③; // 利用 cnt 數組統計數量
for (int i = 0; i < maxs; ++i)
cnt[i + 1] += cnt[i];
for (int i = n - 1; i >= 0; --i)
④ // 記錄最終排序結果
for (int i = 0; i < n; i++)
printf("%d %d", ⑤);
return 0;
}
①處應填()
A. ++cnt [i] B. ++cnt[b[i]] C. ++cnt[a[i] * maxs + b[i]] D. ++cnt[a[i]]
②處應填()
A. ord[--cnt[a[i]]] = i B. ord[--cnt[b[i]]] = a[i]
C. ord[--cnt[a[i]]] = b[i] D. ord[--cnt[b[i]]] = i
③處應填()
A. ++cnt[b[i]] B. ++cnt[a[i] * maxs + b[i]] C. ++cnt[a[i]] D. ++cnt [i]
④處應填()
A. res[--cnt[a[ord[i]]]] = ord[i] B. res[--cnt[b[ord[i]]]] = ord[i]
C. res[--cnt[b[i]]] = ord[i] D. res[--cnt[a[i]]] = ord[i]
⑤處應填()
A. a[i], b[i] B. a[res[i]], b[res[i]] C. a[ord[res[i]]]j b[ord[res[i]]] D. a[res[ord[i]]]j b[res[ord[i]]]
【答案】BDCAB
【解析】