北郵計算機考研復試題的C語言解答精選
二進制數
題目
題目描述:
大家都知道,數據在計算機里中存儲是以二進制的形式存儲的。
有一天,小明學了C語言之后,他想知道一個類型為unsigned int 類型的數字,存儲在計算機中的二進制串是什么樣子的。
你能幫幫小明嗎?并且,小明不想要二進制串中前面的沒有意義的0串,即要去掉前導0。
輸入:
第一行,一個數字T(T<=1000),表示下面要求的數字的個數。
接下來有T行,每行有一個數字n(0<=n<=10^8),表示要求的二進制串。
輸出:
輸出共T行。每行輸出求得的二進制串。
樣例輸入:
5
23
535
2624
56275
989835
樣例輸出:
10111
1000010111
101001000000
1101101111010011
11110001101010001011
ac代碼
沒什么可說的,簡單的機制轉換,連大數除法都沒考察!
#include <stdio.h> #include <string.h> #include <stdlib.h> struct stack { int top; int data[100]; }; void convert_to_binary(struct stack *s, unsigned long int d) { s->top = 0; while (d) { s->data[s->top ++] = d % 2; d /= 2; } while (s->top) { printf("%d", s->data[-- s->top]); } printf("\n"); } int main() { int i, n; unsigned long int d; struct stack *s = (struct stack*)malloc(sizeof(struct stack)); while (scanf("%d", &n) != EOF) { for (i = 0; i < n; i ++) { scanf("%ld", &d); if (d != 0) { convert_to_binary(s, d); }else { printf("0\n"); } } } return 0; }
/**************************************************************
Problem: 1473
User: wangzhengyi
Language: C
Result: Accepted
Time:10 ms
Memory:904 kb
****************************************************************/
二叉排序樹
題目
題目描述:
二叉排序樹,也稱為二叉查找樹??梢允且活w空樹,也可以是一顆具有如下特性的非空二叉樹:
1. 若左子樹非空,則左子樹上所有節(jié)點關鍵字值均不大于根節(jié)點的關鍵字值;
2. 若右子樹非空,則右子樹上所有節(jié)點關鍵字值均不小于根節(jié)點的關鍵字值;
3. 左、右子樹本身也是一顆二叉排序樹。
現在給你N個關鍵字值各不相同的節(jié)點,要求你按順序插入一個初始為空樹的二叉排序樹中,每次插入后成功后,求相應的父親節(jié)點的關鍵字值,如果沒有父親節(jié)點,則輸出-1。
輸入:
輸入包含多組測試數據,每組測試數據兩行。
第一行,一個數字N(N<=100),表示待插入的節(jié)點數。
第二行,N個互不相同的正整數,表示要順序插入節(jié)點的關鍵字值,這些值不超過10^8。
輸出:
輸出共N行,每次插入節(jié)點后,該節(jié)點對應的父親節(jié)點的關鍵字值。
樣例輸入:
5
2 5 1 3 4
樣例輸出:
-1
2
2
5
3
ac代碼
沒什么思路,最簡單的構建二叉排序樹而已
#include <stdio.h> #include <stdlib.h> #include <string.h> struct btree { struct btree *lchild, *rchild; unsigned long int data; }; struct btree* create_btree(struct btree *t, unsigned long int d, unsigned long int parent); int main() { int i, n; unsigned long int d; struct btree *t; while (scanf("%d", &n) != EOF) { t = NULL; for (i = 0; i < n; i ++) { scanf("%ld", &d); t = create_btree(t, d, -1); } } return 0; } struct btree* create_btree(struct btree *t, unsigned long int d, unsigned long int parent) { if (t == NULL) { t = (struct btree *)malloc(sizeof(struct btree)); t->data = d; t->lchild = NULL; t->rchild = NULL; printf("%ld\n", parent); }else if(t->data > d) { t->lchild = create_btree(t->lchild, d, t->data); }else if(t->data < d) { t->rchild = create_btree(t->rchild, d, t->data); }else { exit(EXIT_FAILURE); } return t; }
/**************************************************************
Problem: 1467
User: wangzhengyi
Language: C
Result: Accepted
Time:10 ms
Memory:904 kb
****************************************************************/
矩陣冪
題目
題目描述:
給定一個n*n的矩陣,求該矩陣的k次冪,即P^k。
輸入:
輸入包含多組測試數據。
數據的第一行為一個整數T(0<T<=10),表示要求矩陣的個數。
接下來有T組測試數據,每組數據格式如下:
第一行:兩個整數n(2<=n<=10)、k(1<=k<=5),兩個數字之間用一個空格隔開,含義如上所示。
接下來有n行,每行n個正整數,其中,第i行第j個整數表示矩陣中第i行第j列的矩陣元素Pij且(0<=Pij<=10)。另外,數據保證最后結果不會超過10^8。
輸出:
對于每組測試數據,輸出其結果。格式為:
n行n列個整數,每行數之間用空格隔開,注意,每行最后一個數后面不應該有多余的空格。
樣例輸入:
3
2 2
9 8
9 3
3 3
4 8 4
9 3 0
3 5 7
5 2
4 0 3 0 1
0 0 5 8 5
8 9 8 5 3
9 6 1 7 8
7 2 5 7 3
樣例輸出:
153 96
108 81
1216 1248 708
1089 927 504
1161 1151 739
47 29 41 22 16
147 103 73 116 94
162 108 153 168 126
163 67 112 158 122
152 93 93 111 97
ac代碼
這個也是挺簡單的,就是個矩陣乘法,三個for循環(huán)即可
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 15 int a[LEN][LEN], b[LEN][LEN], c[LEN][LEN]; void multiplay_matrix(); int main() { int t, n, k, i, j, d; scanf("%d", &t); while (t --) { // 接收矩陣 scanf("%d %d", &n, &k); for (i = 0; i < n; i ++) { for (j = 0; j < n; j ++) { scanf("%d", &d); a[i][j] = d; b[i][j] = d; c[i][j] = d; } } // 矩陣的冪 if (k != 1) { multiplay_matrix(k, n); } for (i = 0; i < n; i ++) { for (j = 0; j < n; j ++) { if (j == n - 1) { printf("%d\n", c[i][j]); }else { printf("%d ", c[i][j]); } } } } return 0; } void multiplay_matrix(int k, int n) { int i, j, h, data; k --; while (k --) { for (i = 0; i < n; i ++) { for (j = 0; j < n; j ++) { for (h = data = 0; h < n; h ++) { data += b[i][h] * a[h][j]; } c[i][j] = data; } } for (i = 0; i < n; i ++) { for (j = 0; j < n; j ++) { b[i][j] = c[i][j]; } } } }
/**************************************************************
Problem: 1474
User: wangzhengyi
Language: C
Result: Accepted
Time:10 ms
Memory:912 kb
****************************************************************/
IP數據包解析
題目
頭部長度單位為4字節(jié)。
你的任務是,簡要分析輸入數據中的若干個TCP數據段的頭部。 詳細要求請見輸入輸出部分的說明。
輸入:
第一行為一個整數T,代表測試數據的組數。
以下有T行,每行都是一個TCP數據包的頭部分,字節(jié)用16進制表示,以空格隔開。數據保證字節(jié)之間僅有一個空格,且行首行尾沒有多余的空白字符。
保證輸入數據都是合法的。
輸出:
對于每個TCP數據包,輸出如下信息:
Case #x,x是當前測試數據的序號,從1開始。
Total length = L bytes,L是整個IP數據包的長度,單位是1字節(jié)。
Source = xxx.xxx.xxx.xxx,用點分十進制輸出源IP地址。輸入數據中不存在IPV6數據分組。
Destination = xxx.xxx.xxx.xxx,用點分十進制輸出源IP地址。輸入數據中不存在IPV6數據分組。
Source Port = sp,sp是源端口號。
Destination Port = dp,dp是目標端口號。
對于每個TCP數據包,最后輸出一個多余的空白行。
具體格式參見樣例。
請注意,輸出的信息中,所有的空格、大小寫、點符號、換行均要與樣例格式保持一致,并且不要在任何數字前輸出多余的前導0,也不要輸出任何不必要的空白字符。
樣例輸入:
2
45 00 00 34 7a 67 40 00 40 06 63 5a 0a cd 0a f4 7d 38 ca 09 cd f6 00 50 b4 d7 ae 1c 9b cf f2 40 80 10 ff 3d fd d0 00 00 01 01 08 0a 32 53 7d fb 5e 49 4e c8
45 00 00 c6 56 5a 40 00 34 06 e0 45 cb d0 2e 01 0a cd 0a f4 00 50 ce 61 e1 e9 b9 ee 47 c7 37 34 80 18 00 b5 81 8f 00 00 01 01 08 0a 88 24 fa c6 32 63 cd 8d
樣例輸出:
Case #1
Total length = 52 bytes
Source = 10.205.10.244
Destination = 125.56.202.9
Source Port = 52726
Destination Port = 80
Case #2
Total length = 198 bytes
Source = 203.208.46.1
Destination = 10.205.10.244
Source Port = 80
Destination Port = 52833
ac代碼
注意取源端口號和目的端口號時需要注意ip頭部長度的判斷,IHL,其它就沒神馬難度了
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 1000 int change_tint(char *str, int begin, int num) { int i; char *temp = (char *)malloc(sizeof(char) * (num + 1)); for(i = 0; i < num; i ++) { temp[i] = str[begin + i]; } temp[i] = '\0'; return strtol(temp, NULL, 16); } void ip_field(char *str, int begin, int num) { int i, flag, ip; for (i = 0, flag = 1; i < num; i += 2) { ip = change_tint(str, begin + i, 2); printf("%d", ip); if (flag <= 3) { printf("."); flag ++; } } printf("\n"); } int main() { int index, i, j, n, length, ihl; char ipstr[LEN], temp[LEN]; while (scanf("%d\n", &n) != EOF) { if (n != 0) { for (index = 1; index <= n; index ++) { memset(ipstr, 0, sizeof(ipstr)); memset(temp, 0, sizeof(temp)); gets(temp); // 去除空格 for (i = j = 0, length = strlen(temp); i < length; i ++) { if (temp[i] != ' ') { ipstr[j ++] = temp[i]; } } ipstr[j] = '\0'; // 當前測試數據的序號 printf("Case #%d\n", index); // 整個ip數據包的長度 length = change_tint(ipstr, 4, 4); printf("Total length = %d bytes\n", length); // 源ip地址和目的ip地址 printf("Source = "); ip_field(ipstr, 24, 8); printf("Destination = "); ip_field(ipstr, 32, 8); // 源端口號和目的端口號 ihl = change_tint(ipstr, 1, 1) * 4 * 2; printf("Source Port = %d\n", change_tint(ipstr, ihl, 4)); printf("Destination Port = %d\n", change_tint(ipstr, ihl + 4, 4)); printf("\n"); } } } return 0; }
/**************************************************************
Problem: 1475
User: wangzhengyi
Language: C
Result: Accepted
Time:10 ms
Memory:908 kb
****************************************************************/
上一篇:使用C語言詳解霍夫曼樹數據結構
欄 目:C語言
下一篇:C語言中的malloc使用詳解
本文標題:北郵計算機考研復試題的C語言解答精選
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2876.html
您可能感興趣的文章
- 01-10VC++簡單實現關機、重啟計算機實例代碼
- 01-10vc獲取計算機名和ip地址的方法
- 01-10北郵考研復試C語言上機題目精選
- 01-10C/C++產生隨機數函數簡單介紹
- 01-10浮點數在計算機中存儲方式是怎樣的
- 01-10淺析C語言中堆和棧的區(qū)別
- 01-10C語言實現小學生計算機輔助教學系統(tǒng)


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 01-11ajax實現頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子