北邮计算机考研复试题的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
    ****************************************************************/

(0)

相关推荐

  • C语言实现计算树的深度的方法

    本文实例讲述了C语言实现计算树的深度的方法.是算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> using namespace std; struct Node { Node(int i = 0, Node *l = NULL, Node *r = NULL) : data(i), left(l), right(r) {}

  • c语言计算三角形面积代码

    复制代码 代码如下: //面积公式s = (a+b+c) / 2   area = sqrt(s * (s - a) * (s - b) * (s - c));//小作业 求三角形的面积 int check(double a);int check2(double a, double b, double c); #include <stdio.h>#include <math.h>int main(void){    double area = 0;    double s;   

  • C语言简单实现计算字符个数的方法

    本文实例讲述了C语言简单实现计算字符个数的方法.分享给大家供大家参考.具体如下: char_counting.c如下: #include<stdio.h> int main() { long nc; nc = 0; while(getchar() != '0') { ++nc; } printf("%ld\n", nc); } 编译和使用下: 复制代码 代码如下: gcc char_counting.c -o char_counting.o 一种通常的调用方式: 复制代码

  • C语言科学计算入门之矩阵乘法的相关计算

    1.矩阵相乘 矩阵相乘应满足的条件: (1) 矩阵A的列数必须等于矩阵B的行数,矩阵A与矩阵B才能相乘: (2) 矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数: (3) 矩阵C中第i行第j列的元素等于矩阵A的第i行元素与矩阵B的第j列元素对应乘积之和,即 如: 则: 2. 常用矩阵相乘算法     用A的第i行分别和B的第j列的各个元素相乘求和,求得C的第i行j列的元素,这种算法中,B的访问是按列进行访问的,代码如下: void arymul(int a[4][5], int b[

  • C语言中字符的输入输出以及计算字符个数的方法详解

    C语言字符输入与输出 标准库提供的输入/输出模型非常简单.无论文本从何处输入,输出到何处,其输入/输出都是按照字符流的方式处理.文本流是由多行字符构成的字符序列,而每行字符则由 0 个或多个字符组成,行末是一个换行符.标准库负责使每个输入/输出流都能够遵守这一模型.使用标准库的 C 语言程序员不必关心在程序之外这些行是如何表示的. 标准库提供了一次读/写一个字符的函数,其中最简单的是 getchar 和 putchar 两个函数.每次调用时,getchar 函数从文本流中读入下一个输入字符,并将

  • C语言中计算二叉树的宽度的两种方式

    C语言中计算二叉树的宽度的两种方式 二叉树作为一种很特殊的数据结构,功能上有很大的作用!今天就来看看怎么计算一个二叉树的最大的宽度吧. 采用递归方式 下面是代码内容: int GetMaxWidth(BinaryTree pointer){ int width[10];//加入这棵树的最大高度不超过10 int maxWidth=0; int floor=1; if(pointer){ if(floor==1){//如果访问的是根节点的话,第一层节点++; width[floor]++; flo

  • 安装OpenMPI来配合C语言程序进行并行计算

    安装OPENMPI 由于是实验,也不进行多机的配置了,只在虚拟机里安装吧.多个机器的配置可以参考此文 最简单的方法,apt安装 sudo apt-get install libcr-dev mpich2 mpich2-doc 测试 hello.c /* C Example */ #include <mpi.h> #include <stdio.h> int main (int argc, char* argv[]) { int rank, size; MPI_Init (&

  • C语言求幂计算的高效解法

    本文实例演示了C语言求幂计算的高效解法.很有实用价值.分享给大家供大家参考.具体方法如下: 题目如下: 给定base,求base的幂exp 只考虑基本功能,不做任何边界条件的判定,可以得到如下代码: #include <iostream> using namespace std; int cacExp(int base, int exp) { int result = 1; int theBase = 1; while (exp) { if (exp & 0x01) result =

  • C语言实现直角坐标转换为极坐标的方法

    本文实例讲述了C语言实现直角坐标转换为极坐标的方法.分享给大家供大家参考,具体如下: #include<stdio.h> #include<math.h> struct complex_s{ double x,y; }; double real_part(struct complex_s z){ return z.x; } double img_part(struct complex_s z){ return z.y; } double magnitude(struct compl

  • C语言 坐标移动详解及实例代码

    题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. 输入: 合法坐标为A(或者D或者W或者S) + 数字(两位以内) 坐标之间以;分隔. 非法坐标点需要进行丢弃.如AA10;  A1A;  $%$;  YAD; 等. 下面是一个简单的例子 如: A10;S20;W10;D30;X;A1A;B10A11;;A10; 处理过程: 起点(0,0) + A10 = (

  • C语言中计算正弦的相关函数总结

    C语言sin()函数:正弦函数 头文件: #include <math.h> sin() 函数用来求给定值的正弦值,其原型为: double sin(double x); [参数]给定的值(弧度). [返回值]返回-1 至1 之间的计算结果. 弧度与角度的关系为: 弧度 = 180 / π 角度 角度 = π / 180 弧度 使用 rtod( ) 函数可以将弧度值转换为角度值. 注意,使用 GCC 编译时请加入-lm. 举例如下: #include <stdio.h> #incl

随机推荐