北邮计算机考研复试题的C语言解答精选

 更新时间:2015年08月16日 09:49:12   作者:低调小一  
这篇文章主要介绍了北邮计算机考研复试题目的C语言解答精选,选自2012年的一些基础的上机题目,需要的朋友可以参考下

二进制数
题目

    题目描述: 
      大家都知道,数据在计算机里中存储是以二进制的形式存储的。 
      有一天,小明学了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数据包解析
题目

201581695025979.png (521×497)

    头部长度单位为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
    ****************************************************************/ 

相关文章

  • C语言形参与实参使用的差别讲解

    C语言形参与实参使用的差别讲解

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用,形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送
    2023-02-02
  • C语言实现数学表达式运算

    C语言实现数学表达式运算

    这篇文章主要为大家详细介绍了c语言实现数学表达式运算,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C/C++ 原生API实现线程池的方法

    C/C++ 原生API实现线程池的方法

    线程池,简单来说就是有一堆已经创建好的线程,接下来通过本文给大家介绍C/C++ 原生API实现线程池的方法,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • C语言动态内存分配图文讲解

    C语言动态内存分配图文讲解

    给数组分配多大的空间?你是否和初学C时的我一样,有过这样的疑问。这一期就来聊一聊动态内存的分配,读完这篇文章,你可能对内存的分配有一个更好的理解
    2023-01-01
  • C语言qsort()函数的使用方法详解

    C语言qsort()函数的使用方法详解

    qsort是一个库函数,基于快速排序算法实现的一个排序的函数,下面这篇文章主要给大家介绍了关于C语言qsort()函数使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • C++构建函数使用介绍

    C++构建函数使用介绍

    构造函数主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用;析构函数主要作用在于对象销毁前系统自动调用,执行一 些清理工作
    2022-08-08
  • C语言简明讲解归并排序的应用

    C语言简明讲解归并排序的应用

    这篇文章主要介绍了 c语言排序之归并排序,归并就是把两个或多个序列合并,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • OpenCV实现马赛克功能

    OpenCV实现马赛克功能

    这篇文章主要为大家详细介绍了OpenCV实现马赛克功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++实现编写二维码的示例代码

    C++实现编写二维码的示例代码

    这篇文章主要为大家详细介绍如何基于C++实现编写二维码的功能,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • C++容器算法示例详解

    C++容器算法示例详解

    在谈到容器算法,我们大概率会用到谓词predicate,谓词返回的类型是布尔类型(bool)可以是lambda表达式、函数对象以及其它可调用的对象,这篇文章主要介绍了C++容器算法,需要的朋友可以参考下
    2024-08-08

最新评论