北航計算機復試06-14上機真題及答案_第1頁
北航計算機復試06-14上機真題及答案_第2頁
北航計算機復試06-14上機真題及答案_第3頁
北航計算機復試06-14上機真題及答案_第4頁
北航計算機復試06-14上機真題及答案_第5頁
已閱讀5頁,還剩38頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、北京航空航天大學計算機系考研復試06-14上機真題及答案復試上機指導1. 本真題只是提供輔助作用,關鍵還是研友平時動手能力練習和對算法、數據結構的理解,參加過 ACM勺有一定優勢沒參加過 的也不用緊張,北航的上機題相對于清華和北大,難度上小很 多,多練習的話,問題不大;2. 上機時,可以快速閱讀所有的題目,按照從易到難的次序做題,保證會的一定得分;3. 熟悉編程環境,熟悉c的常用函數;4. 為了快速測試代碼的正確性,尤其是矩陣輸入的情況,可以利用標準輸入重定向,freopen( “c:input.txt ” , ” r ” ,s tdin);力快測試過5. 注意程序邊界條件的測試;6. 如果你

2、有什么疑問,或者我們提供的材料有問題,歡迎聯系我們:bwiu nbuaa提供北航計算機報考和選導師指導,或者 到給我們留言。個正整數, 輸出時, 再輸出 階乘和號,口.號,輸入樣例1:145輸出樣例1:145,1!+4!+5!=145Yes輸入樣例2:1400輸出樣例2:1400,1!+4!+0!+0!=2714 年上機題 第一題,階乘數。輸入 先輸出這個數本身,跟著一個逗 這個數的各位數字的階乘和,等 的計算結果,并判斷階乘和是否等于原數, 如果相等輸出Yes,否則輸出No。題目說明 輸入的正整數以及其各位階乘和都不會超 出 int 型的表示范圍。No或 2 )加一個冒 的第一個棋子的坐標,

3、最小的為第一個,序號從 1 開始編 果無人獲勝,輸出 no。第二題,五子棋。輸入一個 19*19 的矩陣, 只包含數字 0、 1、2,表示兩人下五子棋的 棋牌狀態, 1、2 分別表示兩人的棋子, 0 表 示空格。要求判斷當前狀態下是否有人獲勝 (橫向、豎向或者斜線方向連成 5 個同色棋 子)。題目說明輸入樣例保證每條線上至多 只有連續 5個同色棋子, 并且保證至多只有 1 人獲勝。如果有人獲勝,輸出獲勝者( 1 接著輸出獲勝的五連珠 從上到下從左到右序 號。如樣例略。第三題,排版題。輸入若干行字符,表示某 電影的演職員表,每行只有一個冒號,冒號 前面是職位,冒號后面是姓名,要求把各行 冒號對齊

4、,刪除多余空格后輸出。先輸入一 個數字,表示排版要求的冒號位置,該位置 號保證比各行冒號前的最大字符數還要大。 再輸入若干行字符,最多 50 行,每行最多 100 個字符,除空格、制表符和回車之外都 是有效字符, 要求每行的冒號處于格式要求 的位置,冒號兩邊與有效單詞之間各有一個 空格,冒號前面的單詞之間只有一個空格 (刪除多余的空格和制表符) ,在冒號左邊 右對齊,前面全由空格填充,冒號后面的單 詞之間也只有一個空格,在冒號右邊左對 齊,最后一個單詞后不加空格直接換行。13 年上機題 第一題,給一個真分數的分子分母,輸出約 分后的分子分母,送分題, 25 分;第二題, 簡單版八皇后, 15

5、分;第三題, 給出一個標 準輸入的正數 (開頭末尾沒有多余的 0),輸 出其科學計數法表示結果。比如:輸入 0.000002 ,輸出 2e-6 ;輸入 123.456 ,輸出 1.23456e2 ;輸入 123456,輸出 1.23456e212機題1. 【問題描述】某些整數能分解成若干個連續整數的和的形式,例如15 = 1 + 2+ 3+ 4+ 515 = 4 + 5 + 615 = 7 + 816某些整數不能分解為連續整數的和,例如:輸入:一個整數 N( N int main()#defi neDEBUG BUAA 122int n;while ( scanf ( %d,&n) != EO

6、F)int begi n,end;int found = 0;for (begin=1;beginn;begin+)for (end=begin+1;endn;end+)/連續整數求和int sum = (beg in + en d)*(e nd-begi n+1)/2; if (sum = n)/可以分解,輸岀結果found = 1;int i;for (i=begin;iint main ()intN: /矩陣維數intintisla nd100100:data1004:/輸入島數據的方陣#ifdef DEBUG BUAA 122freopen(/Users/bwiunbuaa/tmp/o

7、j/buaa_122.in#endif /* JOBDU H */r . stdi n):while ( seanf ( %d,&N) != EOF)int i.j:/初始化memset (data.-1.100*4*/讀入數據forsizeof(int);(i=0:iN:i+)for (j=0:jN:j+)seanf (%d .&islandij):/printf(i=%d.j=%dn.i.j): for debugfor(i=0:iN:i+)for (j=0:jN:j+)if (islandij = 1)/小島邊界if(datai0 = -1)datai0 = j: if(dataj2 =

8、 -1)dataj2 = i:datai1 = j:dataj3 = i: intforarea = 0:(i=0:iN:i+)for (j=O:j dataj2 & i datai0& j datai1)area+;#in clude printfreturn 0;3.【問題描述】(“dn ,area);統計關鍵字岀現位置輸入:一行標準c語言代碼(字符個數小于300),統計岀該字符串中關鍵字的if , while , for所在的位置,按照關鍵字岀現的順序依次輸岀。注意雙引號內的不需要統計。輸入:一行標準 c語言代碼,字符個數小于 300輸出:關鍵字if , while , for對應的位置

9、,按照關鍵字岀現的順序依次輸岀。輸岀格式為:關鍵 字,后跟冒號, 樣例輸入:#in clude然后是岀現的位置。掃描到關鍵字就輸岀,每個輸岀占一行。#in eludeintmainO inti = 0;if(i = 0) printf(YES);ifwhile=0; int forif = 1;char*str = while; while(ifwhile = 0) ifwhile = 1;forif = 0;return 0; if for while=a;char=0) if_for_while = b; if(ifwhile = 1) if_for_while =

10、c; return 0;樣例輸出:if:43if(forifwhile:88if:133if:170strtok 函首先把輸入字符串切分為一個個的單詞,然后對每個單詞進行匹配。注意c語言中的數,不能夠返回位置(當分隔符連續時,比如+=,計算岀前導的分割符有幾個),所以不能滿足本題的要求,必須自己寫獲取單詞的函數(反正也不復雜啦)。因為考慮到引號的問題,我們的解決方案是首先對輸入字符串進行預處理,將“”內的每個字符都替換為#,然后再進行單詞分割(切詞),最后進行匹配。具體步驟:輸入源碼字符串預處理,將”內的每個字符替換為 #一次獲取源碼中的單詞,看是否為查找的關鍵詞,如果是則輸岀代碼:#in c

11、ludevstdio.h#in clude#defineDEBUG_BUAA_123#defineMAX_WORD_LEN 128#defineMAX_LEN 300#defineKW_NUM 3/* 將一段源代碼中間的,位于雙引號*/”的以 #代替void replaceQuota ( char buf)intintintfori;len = strlen (buf); quotaL = 0,quotaR = 0;(i=0;ilen;i+)if (bufi = )/ 左引號if (quotaL = 0)quotaL = 1; else / 右引號quotaL = quotaR = 0; el

12、se/if(quotaL = 1) bufi =#判斷字符是否為分隔符/ 該字符屬于引號之間的,替換為 #intisdelim ( char ch) switch (ch)casecasecasecasecasecasecasecase()casecasereturn1;default: return0;do/*/intgetWord (char input, intint p os, char word) len =strle n(inp ut):intintintintfori;isbeg in = 0;wpos = 0:(i=p os:i=le n) ? -1:i:/0()inp ut3

13、00:wordMAX_WORD_LEN:DEBUG BUAA 123勿忘,切記如果到文件結尾了,返回-1從input 數組下標pos處開始一個單詞返回的單詞放在 word數組中 返回下次查找開始的位置,stdin);/單詞分隔符freopen(/Users/bwiunbuaa/tmp/oj/buaa_123.in#endif/* JOBDU H */ char delimn = while ( gets (input) != NULL)/首先對input進行預處理,將引號中間的字符都轉化為#repl aceQuota(i np ut):int beg_ pos = 0:beg_ pos = g

14、etWord(i np ut,beg_ po s,word);intwle n =strle n(word);/判斷是否為指定的關鍵字/位置以1開始,而不是0,所if ( strcmp ( if ,word) = 0)printf (if:%dn,beg_pos-wlen+1);以要加1 else,word) = 0),beg_ po s-wle n+1);if (strcmp ( whileprintf ( while:%dn elseif (strcmp( forprintf ( for:%dn,word) = 0),beg_ pos-wle n+1); while(beg_pos = 0

15、);return 0;11機題if (X = 1) return 0;1. 【問題描述】孿生數定義:如果A的約數(因數,包含 1,但不包含 A本身)之和等于 B ,B的約數(因數)之和等于 A,A和B稱為孿生數(A和B不相等)。試找岀正整數 M和N之間 的孿生數。輸入:從控制臺輸入兩個正整數M和N( 1=MN=20000),中間用一個空格分隔。輸出:在標準輸岀上輸岀符合題目描述的M和N之間的全部孿生數對(包括M和N)。每行輸岀一NONE。對孿生數,用一個空格隔開,小的先輸岀;各行孿生數按照第一個數從小到大的順序輸岀, 一對孿生數只輸岀一次。如果沒有符合要求的孿生數對,則輸岀字符串“輸入樣例20

16、 300200 250輸出樣例220 284NONE樣例說明間有一對孿生數對,即:220( 1+2+4+71 + 142=220 )。樣例2輸入的區間NONE樣例1輸入的區間為20,300,其(1+2+4+5+10+11+20+22+44+55+110=284 )和 284是200,250,其間沒有孿生數對,所以輸岀字符串:評分標準5個測試點,提交程序文件名為example1.e或該題要求輸岀區間中的所有孿生數對,共有example1.epp。這題目很簡單,比較每對數的約數和,看是否滿足條件,如果滿足則輸出。代碼:#in elude#in elude/計算x約數的和int yinzisum (

17、 int x)int i=1,sum=0;intwhile (i y)max=x; min=y; else max=y; min=x; int forfor* array=( int *) malloc ( sizeof ( int )*(max-min+1); (i=0;imax-min+1;i+) arrayi=yinzisum(min+i);(i=0;imax-min+1;i+) for (j=i+1;jmax-min+1;j+)if (arrayi=j+min & arrayj=i+min)printf ( %d %dn ,i+min,j+min); flag=1; if (flag=

18、0) printf return 1;( NONEn );【問題描述】先輸入兩個矩陣 A和B,然后輸入替換位置(左上角) ,編寫程序將矩陣 A中從替換位置開 始的子矩陣(與 B同樣大?。┨鎿Q為 B,并輸岀替換后的矩陣。【輸入形式】從控制臺先輸入矩陣 A的行數和列數(行數和列數均大于等于1,小于等于20),然后在新的行上輸入矩陣 A的各行數字(以一個空格分隔的整數)。再以同樣的方式輸入矩陣 B。最后輸入替換位置(用一個空格分隔的兩個整數表示,行數和列數都從1 開始計數,因此兩個整數都大于等于 1)。若替換位置超岀了矩陣 A的行數或列數,則原樣輸岀矩陣A。2.【輸出形式】在標準輸岀上分行輸岀替換后

19、的矩陣,每行中各數字之間以一個空格分隔?!据斎霕永?】10 2 34 -1 800 902 76 56 -200 23 135 0 0 98 8 30002000 100 -1 1 2 08 7 85 963 496 8【輸出樣例1】10 2 34 -1 800 902 76 56 -200 23 135 0 9 9 9 30002000 100 9 9 9 08 7 85 963 496 8【樣例1說明3行的第3列,即:將A中輸入的矩陣A為5行6列,矩陣B是2行3列,替換位置為第 第3行第3列開始的、行數為 2列數為3的子矩陣替換為 Bo【輸入樣例210 2 34 -12 76 56 -20

20、035 0 0 982 3【輸出樣例210 2 34 -12 76 9 935 0 9 9【樣例2說明輸入的矩陣A為3行4列,矩陣B是2行3列,替換位置為第 第2行第3列開始的、行數為 2列數為3的子矩陣替換為 Bo 所以只實現了部分替換?!驹u分標準該題要求輸岀替換后的矩陣,共有example2.cpp o2行的第3列, 但該子矩陣超岀了即:將A中A的范圍,5個測試點,提交程序文件名為exa mpl e2.c 或很簡單,略。代碼:#in eludevstdio.h#in eludevoidmain()3.int x0,y0,i,j,x1,y1,x2,y2;printf (“輸入矩陣行列數 sc

21、anf (%d%d,&x0,&y0); int行,列:);forfor* array0=( int *) (i=0;ix0;i+)array0i=( int *)(i=0;ix0;i+)for (j=0;jy0;j+)scanf (%d,&array0ij);malloc (sizeofmalloc (sizeof(int(int*)*x0);)*y0);printf (輸入矩陣行列數 scanf (%d%d,&x1,&y1); int行,列:);forfor* array1=( int *) (i=0;ix1;i+)array1i=( int *)(i=0;ix1;i+)for (j=0;j

22、y1;j+)scanf (%d,&array1ij);malloc (sizeofmalloc (sizeof(int(int*)*x1);)*y1);printf (輸入替換坐標行,列:); scanf ( %d%d,&x2,&y2);for(i=0;ix0 & ix1;i+)for (j=0;jy0 & jy1;j+)array0i+x2-1j+y2-1=array1ij;for(i=0;ix0;i+)for (j=0;jget in dex ( char ch)intin dex=-1;if (ch= a& ch= 0& ch= A& ch= Zint)in dex=2;return i

23、n dex;int main ()char str300,ch; ch= getchar (); int i=0,j;while (ch!= n stri=ch; ch= getchar i+;stri=0for (i=0;stri!=if (stri=();0;i+) )if (getindex(stri-1)=getindex(stri+1) & getindex(stri-1)!=-1)ch=stri-1+1;while (chstri+1)putchar (ch); ch+; elseputchar(stri);return 0;2010 年上機真題(回憶版)241. 利用泰勒公式求

24、cos(x)=1-x 2/2!+x 4/4!- , 公式已給,重要的就是注意細節 (比如階乘的存儲最好用 double 類型),二級 C 語言的難度。2. 歸并兩個有序字符串,要求輸出不能有重復字符(數據結構上做過N遍的Merge 函數)#include#includevoid main char str0200,str1200,str400,ch; ch= getchar ();int i=0,j,k; while (ch!= n str0i=ch; ch= getchar i+; str0i= i=0;()();0ch= getchar (); while (ch!= n str1i=ch

25、; ch= getchar i+; str1i= i=j=k=0; while if0(str0i!=();0& str1j!=0(str0istr1j)(str1j=strk-1) j+;elsestrk=str1j;j+;k+; elseif(str0i=strk-1)i+; j+; elsestrk=str0i;i+;j+;k+;if (str0i=while (str1j!= 0 ) if (str1j!=strk-1) strk+=str1j+;else j+;0)else while (str0i!= 0 if (str0i!=strk-1) strk+=str0i+;elsei+

26、;intforlen gth = strle n (str); (i=0;ivle ngth;i+) printf (%c ,stri);3. 兩個整數數組(無序,可有重復元素),判斷兩個整數數組是否完全相同(重 復元素的話,重復次數也要相同)代碼:#in elude#in eludevstdio.hvstdiib.hvoid main()int n,i,ii,j,k,l; scanf (%d,&n); int forintforfor* arrayO=( (i=0;iv n;i+) scanf ( %d* array1=( (i=0;iv n;i+) scanf ( %d (i=0;iv n

27、;i+)int *) malloc,arrayO+i); int *) malloc,array1+i);(sizeof ( int )*n);(sizeof ( int )*n);j=l=0;for (ii=0;iivn;ii+)if (array0i=array0ii) j+;for (k=0;kvn;k+)if (array1k=array0i) l+;if(j!=l));printf(not equal! nexit (0); printf(equal! n);09年機題1、【問題描述】輸入:立方根的逼近迭代方程是y(n+1) = y(n)*2/3 + x/(3*y(n)*y(n),其

28、中y0=x.求給定的x經輸入有多組數據。每組一行,輸入 x n。過n次迭代后立方根的值。輸出:#in elude#in eludevstdio.hvstdiib.hint buaa.fun e_091()迭代n次后的立方根,double精度,保留小數點后面六位。 樣例輸入:3000000 28樣例輸出:144.224957double x,y;int i,n;while (scanf (%lf%d,&x,&n) != EOF)y=x;for (i=1;iv=n;i+)y=y*2/3+x/(3*y*y);printf ( %.6fn,y);return 0;2、數組排序輸入一個數組的值,求出各個

29、值從小到大排序后的次序。輸入:輸入的第一個數為數組的長度,后面的數為數組中的值,以空格分割 輸出:各輸入的值按從小到大排列的次序。samp leinput:4-3 75 12 -3 outp ut:1 3 2 1代碼:#i ncludevstdio.h# define N 10000int del( int a,i nt n);int bubbl esort(i nt a,i nt n); int locate(i nt a,i nt b,i nt n); int main()int aN,bN,i,j, n,n um, z; while(sca nf(%d,&n )!=EOF) for(i=

30、0;i vn ;i+) sca nf(%d,&ai); bi=ai; bubblesort(a ,n); num=del(a ,n);for(z=0;z vn-1;z+)printf(%d ,l ocate(a,bz,num); printf(%dn,l ocate(a,bn-1,num);return 0;int del( int a,i nt n)int i,j,k;for(i=0,j=i+1;j n;j+) if(ai!=aj) if(k=j-i-1)!=0) while(j vn)aj-k=aj; j+; i+;n=n-k;if(an-2=an-1)n-;return n;int bu

31、bbl esort(int a,int n)int i,j,temp;for(i=0;in;i+) for(j=i;jaj) temp=ai;ai=aj; aj=temp;return 0;int locate(int a,int b,int n)int i,j,k;for(i=0;in;i+)if(ai=b) return i+1;刪除輸入的字符串 ( 不區分大小寫 ), 輸出至 fileout.txt中的 In 、IN、iN 、in 刪除, 每行中的空格全部提前至行首 ,3、字符串的查找刪除 給定文件 filein.txt 按要求輸出 fileout.txt 。 輸入 : 無空格的字符串

32、輸出 : 將 filein.txt sample 輸入 :in 輸出: 將 filein.txt 輸出至 fileout.txt filein.txt 中的值為 : #include int main() printf( Hi ); 輸出的 fileout.txt 為 #cludetma()p rtf(Hi);代碼:#i nclude #i nclude #in clude int mai n()char a100;int i,n,j;char c;sca nf(%s,a);n=strle n( a);i=0;c=getchar(); while(c=getchar()!=EOF)if(tol

33、ower(c)=tol ower(ai) i+;if(i=n)i=0; elseif(i=O)if(c!=)pu tchar(c); elsefor(j=0;ji;j+)p utchar(aj);i=0;if(c!=)pu tchar(c);08 年機題1. 素數輸入一個整數, 要求輸出所有從 1 到這個整數之間個位為 1的素數,如果沒有則 輸出-1(30分)#includ e int main()int n,i,j,flag;while(scanf(%d,&n)!=EOF)flag=0; for(i=2;in;i+) for(j=2;ji;j+)if(i%j=0)break;if(j=i&(

34、i-1)%10=0)if(!flag)printf(%d,i);flag=1;elseprintf( %d,i);if(flag) printf(n);else if(!flag)printf(-1n); return 0;9 階以下矩陣,要求判斷第二個是否是第一個的旋轉矩陣, 如果是,2. 旋轉矩陣 任意輸入兩個 輸出旋轉角度( 0、90、180、270),如果不是,輸出 -1 。 要求先輸入矩陣階數, 然后輸入兩個矩陣, 每行兩個數之間可以用任意個空格分 隔。行之間用回車分隔,兩個矩陣間用任意的回車分隔。 (60 分) #includ e int judge(int a99,int b99

35、,int n)int i,j,count=0;if(a00=b00&a0n-1=b0n-1&an-10=bn-10&an-1n-1 =bn-1n-1)for(i=0;in;i+) for(j=0;jn;j+) if(aij=bij) count+;if(count=n*n) return 0; else return -1;else if(a00=b0n-1&a0n-1=bn-1n-1&an-10=b00&an-1n -1=bn-10)for(i=0;in;i+) for(j=0;jn;j+) if(aij=bjn-i-1) count+;if(count=n*n) return 90; el

36、se return -1;else if(a00=bn-1n-1&a0n-1=bn-10&an-10=b0n-1&an-1 n-1=b00)for(i=0;in;i+) for(j=0;jn;j+) if(aij=bn-i-1n-j-1) count+;if(count=n*n) return 180;else return -1;elseif(a00=bn-10&a0n-1=b00&an-10=bn-1n-1&an-1n -1=b0n-1)for(i=0;in;i+)for(j=0;jn;j+)if(aij=bn-j-1i) count+;if(count=n*n) return 270;e

37、lse return -1;else return -1;int main()int n,i,j,a99,b99;while(scanf(%d,&n)!=EOF)for(i=0;in;i+)for(j=0;jn;j+)scanf(%d,&aij);for(i=0;in;i+)for(j=0;jn;j+) scanf(%d,&bij); printf(%dn,judge(a,b,n);return 0;3. 字符串匹配string.instring.out 文件中。匹配aa123bb ”,從 string.in 中讀入數據,然后用戶輸入一個短字符串。要求查找 中和短字符串的所有匹配,輸出行號、匹

38、配字符串到 時不區分大小寫,并且可以有一個用中括號表示的模式匹配。如“ 就是說 aa1bb、aa2bb、aa3bb 都算匹配。(60 分) #includ e #includ e #define MAXN 1000 +10 char aMAXNMAXN;char sMAXN;int cmpch(char a,char b) if (a=0&a=a&a=A&a=Z& (a=b|(a+a- A)=b)return 1;else return 0;int main()int n,i,j,m,k,mark,l en; while(scanf(%d,&n)=1) for(i=0;in;i+)scanf(

39、%s,ai); scanf(%s,s); m=strlen(s);for(i=0;in;i+) len=strlen(ai);for(j=0,k=0;jl en,km;j+,k+)if(cmpch(aij,sk) continue; elseif(sk!=) goto out; elsemark=0;k=k+1; while(sk!=)if(cmpch(aij,sk) mark=1; k+;if(mark=0) goto out;out:if(j=l en)&(k=m)printf(%d %sn,i+1,ai);/* for(i=0;in;i+) printf(%sn,ai);printf(%sn,s);*/ return 0;07 年真題1.【問題描述】 從輸入的字符串中,統計空格,回車, TAB 出現的次數 代碼:#include #include intma

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論