程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 北郵盤算機考研復試題的C說話解答精選

北郵盤算機考研復試題的C說話解答精選

編輯:關於C++

北郵盤算機考研復試題的C說話解答精選。本站提示廣大學習愛好者:(北郵盤算機考研復試題的C說話解答精選)文章只能為提供參考,不一定能成為您想要的結果。以下是北郵盤算機考研復試題的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
    ****************************************************************/ 

二叉排序樹
標題

    標題描寫: 
            二叉排序樹,也稱為二叉查找樹。可所以一顆空樹,也能夠是一顆具有以下特征的非空二叉樹: 
     
            1. 若左子樹非空,則左子樹上一切節點症結字值均不年夜於根節點的症結字值; 
            2. 若右子樹非空,則右子樹上一切節點症結字值均不小於根節點的症結字值; 
            3. 左、右子樹自己也是一顆二叉排序樹。 
     
      如今給你N個症結字值各不雷同的節點,請求你按次序拔出一個初始為空樹的二叉排序樹中,每次拔出後勝利後,求響應的父親節點的症結字值,假如沒有父親節點,則輸入-1。 
    輸出: 
    輸出包括多組測試數據,每組測試數據兩行。 
    第一行,一個數字N(N<=100),表現待拔出的節點數。 
    第二行,N個互不雷同的正整數,表現要次序拔出節點的症結字值,這些值不跨越10^8。 
    輸入: 
    輸入共N行,每次拔出節點後,該節點對應的父親節點的症結字值。 
    樣例輸出: 
    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輪回便可

 

  #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字節。 
      你的義務是,扼要剖析輸出數據中的若干個TCP數據段的頭部。 具體請求請見輸出輸入部門的解釋。 
    輸出: 
    第一行動一個整數T,代表測試數據的組數。 
    以下有T行,每行都是一個TCP數據包的頭部門,字節用16進制表現,以空格離隔。數據包管字節之間唯一一個空格,且行首行尾沒有過剩的空白字符。 
    包管輸出數據都是正當的。 
    輸入: 
    關於每一個TCP數據包,輸入以下信息: 
    Case #x,x是以後測試數據的序號,從1開端。 
    Total length = L bytes,L是全部IP數據包的長度,單元是1字節。 
    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
    ****************************************************************/ 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved