内大复试笔试题

211 阅读13分钟

摘要

整理最近四年内的复试笔试题,2016-2019

2019年

(前五题一道题10分 后两题一道题15分)

  1. 输入10个人的成绩,计算平均分,记录低于平均分的人数,并将他们的成绩输入到一个数组中。

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        float stu[10],mean,s[10];
        int g,k=0;
        for(int i=0;i<10;i++){
            cin>>g;
            stu[i]=g;
            mean+=g/10;
        }
        for(int i=0;i<10;i++){
            if(stu[i]<mean){
                s[k]=stu[i];
                k++;
            }
        }
        return 0;
    }
    
    
  2. 使用递归方法从数组中找出最大值。

    using namespace std;
    /*
    int f(int a[], int n)
    {
    	if (n > 1)
    	{
    		int t;
    		t = f(a, n - 1);
    		return (t > a[n - 1]) ? t : a[n - 1];
    	}
    	else
    		return a[0];
    }
    */
    int getMax(int *a,int n){
      if(n==1){
        return a[0];
      }
      int t=getMax(a,n-1);
      if(a[n-1]>t){
         return a[n-1];
      }else{
         return t;
      }
    
    }
    int main()
    {
       int a[]={1,4,3,5,6,87,3,23,6,78,9};
       //int max=f(a,11);
       int max=getMax(a,11);
       cout<<max;
        return 0;
    }
    
    
  3. 求解一元二次方程组(三种情况)。

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main()
    {
        double a , b, c;
    	cin>>a>>b>>c;
    	if (a==0)
    	{
    		cout<<"不是一元二次方程\n"<<endl;
    	}
    	else
    	{
    	    double disc = b*b-4*a*c;
    
    	    if(disc == 0)
    	    {
               cout<<"x="<<-b/(2*a);
    	    }
    	    else if ( disc > 0)
    	    {
    		cout<<"x1="<<(-b+sqrt(disc))/(2*a)<<endl;
            cout<<"x2="<<(-b-sqrt(disc))/(2*a)<<endl;
    
    	    }
    	    else
    	    {
    		cout<<"有两个共轭的复根"<<endl;
    	    }
    	}
    
    
        return 0;
    }
    
  4. 输入字符串和一个数字,并将字符串以数组方式存储并进行平移操作, 如abdcf 向前平移2个 变成dcfab。

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    
    void  move2(char *s , int n,int k){
    
        char t=s[n-1];
        for(int i=n-1;i>0;i--){
           s[i]=s[i-1];
        }
        s[0]=t;
        k--;
        if(k>0)  move2(s,n,k);
    }
    
    void move(char *str,int m)
    {
        int i = 0;
        int j = 0;
        char temp;
        int len = strlen(str);
    
       //循环向后移动m次
        for(i = 0;i < m;i++)
        {
            //向后移动一次
            temp = str[0];
            for(j = 1;j < len;j++)
            {
                str[j-1] = str[j];
            }
            str[len-1] = temp;
        }
    }
    
    int main()
    {   char s[100]={0};
        int n,k;
        cin>>n>>k>>s;
        move2(s,n,k);
        cout<<s;
        return 0;
    }
    
    
  5. 用二维数组实现矩阵乘法,输入两个矩阵Axy, Bxy,求A*B=C。

    #include <iostream>
    
    using namespace std;
    
    #define SIZE_M 2
    #define SIZE_N 3
    #define SIZE_S 4
    
    int main(){
    
    	int matrix_a[SIZE_M] [SIZE_N]={{1,2,3},{4,5,6}};//a矩阵2X3
    	int matrix_b[SIZE_N] [SIZE_S]={{1,2,3,4},{5,6,7,8},{1,2,3,4}};//b矩阵3X4
    	int matrix_result[SIZE_M][SIZE_S];//结果矩阵2X4
    
    
    	for(int m=0;m<SIZE_M;m++){
    		for(int s=0;s<SIZE_S;s++){
    			matrix_result[m][s]=0;//变量使用前记得初始化,否则结果具有不确定性
    			for(int n=0;n<SIZE_N;n++){
    				matrix_result[m][s]+=matrix_a[m][n]*matrix_b[n][s];
    			}
    		}
    	}
    	for(int m=0;m<SIZE_M;m++){
    		for(int s=0;s<SIZE_S;s++){
    			cout<<matrix_result[m][s]<<"\t";
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    
  6. 输入工人的工资,要求工资从小到大进行排序,并以链表的形式进行存储并输出。

    #include <iostream>
    
    using namespace std;
    
    typedef struct LNode {
        int data;  // 数据域(可以是其他类型)
        struct LNode *next;//指针域 (此处代表指向后驱节点)
    }LNode,*LinkList;
    
    LinkList CreatList(LinkList &L){//尾插法建表,输入9999结束
       int x;
       //L=(LinkList)malloc(sizeof(LNode));//c的做法
       L=new LNode;
       LNode *s,*r=L;
       cin>>x;
       while(x!=9999){
         s=new LNode;
         s->data=x;
         r->next=s;
         r=s;
         cin>>x;
       }
       r->next=NULL;
       return L;
    }
    
    void Print(LinkList &L) { //输出链表中的数据
    	LNode *p = L->next;
    	while (p != NULL) {
    		cout << p->data << " ";
    		p = p->next;
    	}
    	cout << endl;
    }
    void Sort(LinkList &L) { //采用头插法
    	LNode *p = L->next, *pre;
    	LNode *r = p->next;
    	p->next = NULL;
    	p = r;
    	while (p!=NULL) {
    		r = p->next;
    		pre = L;
    		while (pre->next != NULL&&pre->next->data < p->data) {
    			pre = pre->next;
    		}
    		p->next = pre->next;
    		pre->next = p;
    		p = r;
    	}
    
    }
    
    int main()
    {
      LNode *L = new LNode; //新建结点,并且创建指针
      L=CreatList(L);
      Sort(L);
      Print(L);
    
        return 0;
    }
    
    
  7. 快速排序。

    #include <iostream>
    
    using namespace std;
    
    int Partition(int a[],int low,int high){
        int p=a[low];
        while(low<high){
            while(low<high&&a[high]>=p) --high;
            a[low]=a[high];
            while(low<high&&a[low]<=p) ++low;
            a[high]=a[low];
        }
        a[low]=p;
        return low;
    }
    void QuickSort(int a[],int low,int high){
        if(low<high){
            int p=Partition(a,low,high);
            QuickSort(a,low,p-1);
            QuickSort(a,p+1,high);
        }
    }
    int main()
    {
        int a[]={1,2,4,6,9,7,6,3,4,8};
        QuickSort(a,0,9);
        for(int i=0;i<10;i++){
        cout<<a[i]<<" ";
       }
        return 0;
    }
    

2018年

  1. 输入俩个数,找到之间的偶数求和

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int m,n,sum=0;
        cin>>m>>n;
        for(int i=m;i<n;i++){
            if(i%2==0)
                sum+=i;
        }
        cout<<sum<<endl;
        return 0;
    }
    
  2. 1+2+2+3+3+3+…+n+n+......+n求和

    #include <iostream>
    
    using namespace std;
    
    int main()
    {   int n,sum=0;
        cin>>n;
        for(int i=1;i<=n;i++)
            sum+=i*i;
        cout<<sum<<endl;
        return 0;
    }
    
  3. 迭代求平方根 给一个迭代式 让你求 他的平方跟

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    {
        float a,x0,x1;
        cin>>a;
        x0=a/2;
        x1=(x0+a/x0)/2;
        do{
            x0=x1;
            x1=(x0+a/x0)/2;
        }
        while(fabs(x0-x1)>=1e-5);
        cout<<x1<<endl;
        return 0;
    }
    
  4. 把文件里面的信息读入 然后80个字符是一行 统计行数 小写字母 大写字母 数字的个数

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int letter=0,digit=0,space=0,others=0;
    
    void strcount(char str[]){
        int i;
      for (i=0; str[i]!='\0'; i++)
            if ((str[i]>='a'&& str[i]<='z')||(str[i]>='A' && str[i]<='Z'))
                letter++;
            else if (str[i]>='0' && str [i]<='9')
                digit++;
            else if (str[i]==32)
                space++;
            else
                 others++;
    
    }
    
    //p1067
    int  main()
    {
        char buffer[256];
        fstream out;
        int line=0;
        out.open("test.txt",ios::in);
        cout<<"test.txt"<<" 的内容如下,回车显示统计内容:"<<endl;
        while(!out.eof())
        {
            out.getline(buffer,256,'\n');//getline(char *,int,char) 表示该行字符达到256个或遇到换行就结束
            cout<<buffer<<endl;
            strcount(buffer);
            line++;
        }
        out.close();
        cin.get();//cin.get() 是用来读取回车键的,如果没这一行,输出的结果一闪就消失了
    
        cout<<"line:"<<line<<" letter:"<<letter<<" digit:"<<digit<<" space:"<<space<<" others:"<<others<<endl;
    }
    
    
  5. 有一道是输入123 输出 每一位的个数 而且输出顺序是3 2 1 用递归

    #include <iostream>
    
    using namespace std;
    
    void Print(int n){
     if(n==0)
         return;
      cout<<n%10<<" ";
      Print(n/10);
    }
    int main()
    {
        int n;
        cin>>n;
        Print(n);
    
        return 0;
    }
    
  6. 考选择排序

    #include <iostream>
    
    using namespace std;
    
    void SelectSort(int a[],int n){
       int min,t;
       for(int i=0;i<n-1;i++){
          min=i;
          for(int j=i+1;j<n;j++)
             if(a[j]<a[min])
                min=j;
         if(min!=i){
            t=a[i];
            a[i]=a[min];
            a[min]=t;
         }
       }
    }
    int main()
    {
        int a[]={1,3,4,5,2,9,7,5};
        SelectSort(a,8);
        for(int i=0;i<8;i++){
            cout<<a[i]<<" ";
        }
        return 0;
    }
    
  7. 是考杨辉三角的 (a+b)n次方 方程的展开后的各项系数

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n,i,j;
        int a[20][20]={0};
        cout<<"输入小于20的n:";
        cin>>n;
        for(i=0;i<n;i++){
           a[i][n-1-i]=1;
           a[i][n-1]=1;
        }
        for(i=2;i<n;i++)
            for(j=n-2;j>n-1-i;j--){
              a[i][j]=a[i-1][j]+a[i-1][j+1];
            }
    
        for(i=0;i<n;i++)
            for(j=0;j<n;j++){
               cout<<a[i][j]<<"     ";
            if(j==n-1)cout<<endl;
            }
    
        return 0;
    }
    
  8. 是一个链表的删除

    问题不清楚,当作删除值为x的节点 建表打印表来自2019.6

    
    #include <iostream>
    
    using namespace std;
    
    typedef struct LNode {
        int data;  // 数据域(可以是其他类型)
        struct LNode *next;//指针域 (此处代表指向后驱节点)
    }LNode,*LinkList;
    
    LinkList CreatList(LinkList &L){//尾插法建表,输入9999结束
       int x;
       //L=(LinkList)malloc(sizeof(LNode));
       L=new LNode;
       LNode *s,*r=L;
       cin>>x;
       while(x!=9999){
         s=new LNode;
         s->data=x;
         r->next=s;
         r=s;
         cin>>x;
       }
       r->next=NULL;
       return L;
    }
    
    void Print(LinkList &L) { //输出链表中的数据
    	LNode *p = L->next;
    	while (p != NULL) {
    		cout << p->data << " ";
    		p = p->next;
    	}
    	cout << endl;
    }
    
    //删除所有值为x的节点
    void deleteX(LinkList &L, int x){
        LNode *p=L->next,*pre=L,*q;
        while(p!=NULL){
            if(p->data==x){
                q=p;
                p=p->next;
                pre->next=p;
                delete q;//C语言用 free(q);
            }
            else{
            pre=p;
            p=p->next;
        }
    
     }
    
    
    }
    
    int main()
    {
      LNode *L = new LNode; //新建结点,并且创建指针
      L=CreatList(L);
      deleteX(L,1);
      Print(L);
    
        return 0;
    }
    

2017年

  1. 是判断一个序列是否是升序,是则输出yes,不是则输出no

    #include<iostream>
    using namespace std;
    int main()
    {
        int a[600] = {0};
        int i;
        for(i=0;i<600;i++){     //输入数字序列
            cin>>a[i];
            if(a[i]==-1)
                break;
        }
        for(i=1;i<600;i++){     //判断是否升序
            if(a[i]==-1)
                break;
            if(a[i]<=a[i-1])
                break;
        }
        if(a[i]==-1)        //输出判断结果
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
        return 0;
    }
    
  2. 整数转化为字符串 分离各位+‘’变字符

    #include<iostream>
    using namespace std;
    int getAnswer(int n)    //计算与7有关的数字个数
    {
        int i,cnt=0;
        for(i=1;i<=n;i++){  //循环n以内的所有数
            if(i%7==0)      //如果当前数是7的倍数,计数+1
                cnt++;
            else{
                int t = i;
                while(t){
                    if(t%10==7){    //如果当前数的某一位是7,计数+1
                        cnt++;
                        break;
                    }
                    t/=10;
                }
            }
        }
        return cnt;
    }
    int main()
    {
        int n;
        cin>>n;
        cout<<getAnswer(n)<<endl;
        return 0;
    }
    
  3. 是输入一个数判断是不是回文数,例如101,12121之类

    #include<iostream>
    #include<string.h>
    using namespace std;
    int isHuiwen(char num[])    //判断是否是回文数
    {
        int i,len = strlen(num);
        for(i=0;i<len;i++)      //前后依次对比每一位数字,遇到不相等的情况,退出循环
            if(num[i]!=num[len-i-1])
                break;
        if(i<len)
            return 0;
        else
            return 1;
    }
    int main()
    {
        char num[1000]={0};
        cin>>num;
        if(isHuiwen(num))       //输出判断结果
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
        return 0;
    }
    
  4. 是输入两个字符串,其中一个逆序后接在第一个字符串之后,并输出

    #include<iostream>
    #include<string.h>
    using namespace std;
    void mycat(char str1[],char str2[])
    {
        int i = strlen(str2)-1;
        int j = strlen(str1);
        for(;i>=0;i--)  //逆序连接
            str1[j++] = str2[i];
        str1[j] = '\0';
    }
    int main()
    {
        char str1[1100] = {0};
        char str2[1100] = {0};
        cin>>str1;      //输入两个字符串
        cin>>str2;
        mycat(str1,str2);   //逆序连接
        cout<<str1<<endl;   //输出连接后的结果
        return 0;
    }
    
  5. 是输入两个数m,n。然后输入一个m进制字符串,将其转化为n进

    #include<iostream>
    #include<string.h>
    using namespace std;
    int toTen(int m,char s[])   //将m进制的数字串转换为十进制并返回
    {   
        int i,d = 1,num = 0;
        for(i=strlen(s)-1;i>=0;i--){    //循环该数字串,将每一位上的位值和位权相乘,累加结果便为对应的十进制数
            int t;
            if('a'<=s[i] && s[i]<='z')
                t = int(s[i]-'a'+10);
            else
                t = int(s[i]-'0');
            num+=t*d;
            d*=m;
        }
        return num;
    }
    void toN(int num,int n,char ans[])  //将十进制数num转换为n进制数,并存储在ans数组中
    {
        int i=0;
        char temp[1100] = {0};
        while(num){         //辗转相除法
            int yu = num%n;
            num/=n;
            if(yu>9)
                temp[i++] = char(yu-10+'a');
            else
                temp[i++] = char(yu+'0');
        }
        int len = i;
        for(i=i-1;i>=0;i--)
            ans[len-i-1] = temp[i];
        ans[len] = '\0';
    }
    int main()
    {
        int m,n;
        char s[1100] = {0};
        char ans[1100] = {0};
        cin>>m>>n;          //输入m和n,以及m进制的数字串
        cin>>s;
        int num = toTen(m,s);   //将m进制的数字串转换为十进制数
        toN(num,n,ans);     //将十进制数转换为n进制数
        cout<<ans<<endl;        //输出转换后的结果
        return 0;
    }
    
  6. 是输入一个正整数n,输出一个蛇形矩阵,就是按照之字形排列小于等于n的数数字大小顺序是按之字形排列的,是斜着的。符串并输出。(蛇形矩阵)

    include <iostream>
    
    using namespace std;
    
    # 通过标记上次的变化方式决定这次的变化,变化包括向右,向下,左下和右上四种情况
    int main()
    {
    
        int a[10][10]={0};int i=0,j=0;
    
        int n;cin>>n;
        //0向右1左下2向下3右上
        a[i][j]=n;a[i][++j]=n-1;int t=0;
        for(int k=n-2;k>0;k--){
            if(t==0)
            {a[++i][--j]=k;t=1;
            else if(t==1){
                if(j==0){
                    a[++i][j]=k;t=2;
                }else{
                    a[++i][--j]=k;t=1;
                }
            }
            else if(t==2){
                a[--i][++j]=k;t=3;
            }
            else if(t==3){
                if(i==0){
                    a[i][++j]=k;t=0;
                }else{
                  a[--i][++j]=k;t=3;
                }
            }
    
        }
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                    if(a[i][j]) cout<<a[i][j]<<" ";
            if(j==9) cout<<endl;
            }
    
        }
        return 0;
    }
    

答案参考自:www.yangyingming.com/article/371…

2016年

  1. 输入三个数,求最大的数输出。 (送分略)

  2. 求两个数最大公约数最小公倍数

    #include <iostream>
    
    using namespace std;
     int  gcd(int  t1, int  t2) {    return t2 == 0 ? t1 : gcd(t2, t1 % t2); }//另一种方法
    int main()
    {
      int m,n,r,p,t;
      cin>>m>>n;
      if(m<0) m=-m;
      if(n<0) n=-n;
      if(m>n){
        t=m;
        n=m;
        m=t;
      }
      p=m*n;
    
      while(m){
        r=n%m;
        n=m;
        m=r;
      }
      cout<<"最大公因数:"<<n<<endl;
      //cout<<"最大公因数:"<<gcd(n,m)<<endl;
      cout<<"最小公倍数:"<<p/n<<endl;
      return 0;
    }
    
    
  3. 统计字符串中字母数字空格和其他字符个数

    #include <iostream>
    
    using namespace std;
    
    int main()
    
    {
        int letter=0,digit=0,space=0,others=0;
        string str;
        getline(cin,str);
        int i=0;
        for (i=0; str[i]!='\0'; i++)
            if ((str[i]>='a'&& str[i]<='z')||(str[i]>='A' && str[i]<='Z'))
                letter++;
            else if (str[i]>='0' && str [i]<='9')
                digit++;
            else if (str[i]==32)
                space++;
            else
                 others++;
    
        cout<<letter<<" "<<digit<<" "<<space<<" "<<others<<endl;
        return 0;
    }
    
    
    
    
  4. 输出*行的一个图案

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int i,j=3,k,g=1;
        for(i=0;i<4;i++)
        {
            for(k=j;k>0;k--)
                cout<<" ";
            for(k=g;k>0;k--)
                cout<<"*";
            for(k=j;k>0;k--)
                cout<<" ";
            j--;
            g+=2;
            cout<<endl;
        }
        j=1;g=5;
        for(i=0;i<3;i++)
        {
            for(k=j;k>0;k--)
                cout<<" ";
            for(k=g;k>0;k--)
                cout<<"*";
            for(k=j;k>0;k--)
                cout<<" ";
            j++;
            g-=2;
            cout<<endl;
        }
    
        return 0;
    }
    
    
  5. 迭代法求平方根

    见 2018.3

  6. 将一个字符串反序输出接在后面再输出8进制转换

    这题啥意思,字符串是一个整数?看不懂略

  7. 输出2k+1个数的中位数

    #include <iostream>
    
    using namespace std;
    
    void BubbleSort(int a[],int n){
       int flag,t;
       for(int i=0;i<n-1;i++){
        flag=0;
        for(int j=n-1;j>i;j--){
            if(a[j]<a[j-1]){
                t=a[j];
                a[j]=a[j-1];
                a[j-1]=t;
                flag=1;
            }
        }
        if(flag==0)
            return;
       }
    }
    
    int main()
    {
        int a[105],k,i;
        cin>>k;
        for(i=0;i<2*k+1;i++)
            cin>>a[i];
    
        BubbleSort(a,9);
        cout<<"中位数为:"<<a[k]<<endl;
        return 0;
    }
    
    
  8. 输入十进制数转换成n进制数并输出,转换后的结果

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n, x;
        char s[105];//十进制以上有字符,所以用char存储
    //输入10进制n 和 要转换的进制x
        cin>>n>>x;
        int cnt = 0;//数组下标
        while (n > 0)  //将n逐位分解
        {
            int w = (n % x);
            if (w < 10) s[cnt++] = w + '0';//变成字符需要加'0'
            else s[cnt++] = (w - 10) + 'A';//如果转换为小写则加'a'
    //如果大于10则从A字符开始
            n /= x;
        }
    //反序输出
        for (int i = cnt - 1; i >= 0; i--)
        {
            cout<<s[i];
        }
        cout<<endl;
        return 0;
    }