西工大计算机复试机试2018+2019篇

本博客系列包含历年所有的复试机试题,以及自己找的一些相同难度的题,具有参考价值。

2019西工大计算机复试机试题

1.一组整数,由小到大排序,有n组测试数据,排序输出

输入样例:
2
1 5 8 6 3 2 0
4 2 3 8 15 63 20 1 
 
Output:
0 1 2 3 5 6 8
1 2 3 4 8 15 20 63

解析:此处注意处理输入和输出即可。用5种做法,冒泡排序、插入排序,快排和归并排序,冒泡时间复杂度等价于插入排序为O(n^2),快排和归并排序复杂度O(nlogn)。归并排序和堆排序后续再补在末尾。

代码:

(1)冒泡排序: 

#include<stdio.h>
int main()
{
	int n;
	int a[100];
	char ch;
	scanf("%d",&n);
	while(n--)
    {
        int i=0,num=0,j;
        do{
            scanf("%d",&a[i]);
            i++;
        }while(scanf("%c",&ch)&&ch!='\n');
        num=i;
        for(i=0;i<num;i++)
        {
            for(j=i;j<num;j++)
            {
                if(a[i]>a[j])
                {
                    int tmp=a[i];
                    a[i]=a[j];
                    a[j]=tmp;
                }
            }
        }
        for(i=0;i<num-1;i++)
            printf("%d ",a[i]);
        printf("%d\n",a[i]);
    }
	return 0;
}

(2)插入排序

#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int n;
	int a[100];
	char ch;
	scanf("%d",&n);
	while(n--)
    {
        int i=0,num=0;
        do{
            scanf("%d",&a[i]);
            i++;
        }while(scanf("%c",&ch)&&ch!='\n');
        num=i;
        for(i=1;i<num;i++)
        {
            if(a[i]<a[i-1])
            {
                 int tmp=a[i];
                 int j;
                 //在此处纠结了好长时间,注意j>=0&&a[j]>tmp要同时满足
                 for(j=i-1;j>=0&&a[j]>tmp;j--)
                      a[j+1]=a[j];
                  a[j+1]=tmp;
            }
         }
        for(i=0;i<num-1;i++)
            printf("%d ",a[i]);
        printf("%d\n",a[i]);
    }
	return 0;
}

(3)快速排序

此处使用两种写法,但思想是一样的:

做法一:

#include <iostream>
#include<stdio.h>
using namespace std;
int Partion(int a[],int i,int j)//每次返回被分的基值下标,下次分别排两边即可
{
    int tmp=a[i];//首元素作为基值
    while(i<j)
    {
        while(i<j&&tmp<a[j])
            j--;
        if(i<j)
            a[i++]=a[j];//注:此处赋值之后要将i移一位,不然出错
        while(i<j&&tmp>a[i])
            i++;
        if(i<j)
            a[j--]=a[i];
    }
    a[i]=tmp;
    return i;
}
void QuickSort(int a[],int i,int j)
{
    int k;
    if(i<j)//如果还有元素的话
    {
        k=Partion(a,i,j);
        QuickSort(a,i,k-1);
        QuickSort(a,k+1,j);
    }
}
int main()
{
	int n;
	int a[100];
	char ch;
	scanf("%d",&n);
	while(n--)
    {
        int i=0,num=0;
        do{
            scanf("%d",&a[i]);
            i++;
        }while(scanf("%c",&ch)&&ch!='\n');
        num=i;
        QuickSort(a,0,num-1);
        for(i=0;i<num-1;i++)
            printf("%d ",a[i]);
        printf("%d\n",a[i]);
    }
	return 0;
}

做法二:

#include <iostream>
#include<stdio.h>
using namespace std;
void QuickSort(int a[],int left,int right)
{
    int i=left,j=right;
    int tmp=a[i];//首元素作为基值
    if(i>=j)//如果没元素的话,结束
       return ;
    while(i<j)
    {
        while(i<j&&tmp<a[j])
            j--;
        if(i<j)
            a[i++]=a[j];//注:此处赋值之后要将i移一位,不然出错
        while(i<j&&tmp>a[i])
            i++;
        if(i<j)
            a[j--]=a[i];
    }
    a[i]=tmp;
    QuickSort(a,left,i-1);
    QuickSort(a,i+1,right);
}
int main()
{
	int n;
	int a[100];
	char ch;
	scanf("%d",&n);
	while(n--)
    {
        int i=0,num=0;
        do{
            scanf("%d",&a[i]);
            i++;
        }while(scanf("%c",&ch)&&ch!='\n');
        num=i;
        QuickSort(a,0,num-1);
        for(i=0;i<num-1;i++)
            printf("%d ",a[i]);
        printf("%d\n",a[i]);
    }
	return 0;
}

(4)归并排序:

#include <iostream>
#include<stdio.h>
using namespace std;
int a[10001],n,d[10001];
void Merge(int low,int mid,int high)
{  //把两个数组合并成一个,并转到原来的数组
    int i=low,j=mid+1;
    int m=mid,n=high;
    int k=0;
    while(i<=m&&j<=n)
    {
        if(a[i]<=a[j])
            d[k++]=a[i++];
        else
            d[k++]=a[j++];
    }
    while(i<=m)
        d[k++]=a[i++];
    while(j<=n)
        d[k++]=a[j++];
    for (i=0;i<k;i++)
        a[low+i]=d[i];
}
void mergesort(int low,int high)
{
    if(low<high)
    {
        int mid=(low+high)/2;
        mergesort(low,mid);    //左边有序
        mergesort(mid+1,high); //右边有序
        Merge(low,mid,high); //再将二个有序数列合并
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int low=0,high=n-1;
    mergesort(low,high);
    for(int i=0;i<n;i++)
        printf("%d\n",a[i]);
    return 0;
}

2.利用海伦公式求三角形面积,是三角形则输出面积(保留两位小数),否则输出NaN。

Input:
2
3.0 4.0 5.0
1.0 2.0 3.0
 
Output:
6.00
NaN

代码:

#include <iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
    {
        double a,b,c;
        cin>>a>>b>>c;
        if(a+b>c&&a+c>b&&b+c>a)
        {
            double p,s;
            p=(a+b+c)/2;
            s=sqrt(p*(p-a)*(p-b)*(p-c));
            printf("%.2lf\n",s);
        }
        else
            cout<<"NaN"<<endl;
    }
	return 0;
}

3.判断ip地址是否合法,以字符串形式输入,格式为a.b.c.d,若每个均为整数且范围在[0,255]之间,则说明是合法的,输出yes,否则输出no。

输入样例:
2
255.2.26.2
1.2.333.4
 
Output:
yes
no

代码:

#include <iostream>
#include<string>
#include<stdio.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	getchar();
	while(n--)
    {
        string str;
        getline(cin,str);
        int len=str.size();
        int dotnum=0;
        int tmp=0;
        int flag=1;
        if(!isdigit(str[0])||!isdigit(str[0]))
            flag=0;//此句很重要,保证数字开头数字结尾
        for(int i=0;i<len;i++)
        {
            if(isdigit(str[i]))
                tmp=tmp*10+str[i]-48;
            else if(str[i]=='.')
            {
                if(!isdigit(str[i+1]))
                {//避免连续两个点相连
                    flag=0;
                    break;
                }
                dotnum++;
                if(dotnum>3)
                {
                    flag=0;
                    break;
                }
                if(tmp>255||tmp<0)
                {
                    flag=0;
                    break;
                }
                tmp=0;
            }
            else
            {
                flag=0;
                break;
            }
        }
        if(dotnum!=3)
            flag=0;
        if(flag==1)
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
	return 0;
}

上面属于憨批做法,下面分享神奇的sscanf和sprintf!!!!

#include<string.h>
#include<stdio.h>
int main()
{
	char str[31],temp[31];
    int a,b,c,d;
    while(gets(str)!=NULL)
    {
        if(sscanf(str,"%d.%d.%d.%d ",&a,&b,&c,&d)==4&&a>=0&&a<=255&&b>=0&&b<=255&&c>=0&&c<=255&&d>=0&&d<=255)
        {
            sprintf(temp,"%d.%d.%d.%d",a,b,c,d); //把格式化的数据写入字符串temp
            if(strcmp(temp,str)==0)
                printf("yes\n");
            else
                printf("no\n");
        }
        else
            printf("no\n");
    }
    return 0; }

4.从m开始找出n个质数,如果m是,也输出m。

输入样例:
4 3
 
Output:
5
7
11

代码:

#include <iostream>
using namespace std;
int main()
{
    int m,n;
    cin>>m>>n;
    for(int tmp=m;n>0;tmp++)
    {
        int flag=1;
        for(int i=2;i<=tmp/2;i++)
        {
            if(tmp%i==0)
            {
                flag=0;
                break;
            }
        }
        if(flag==1)
        {
            cout<<tmp<<endl;
            n--;
        }
    }
    return 0; }

5.求任意两天的日期差。

输入样例:
2
2016 1 1 2016 3 1
2019 1 1 2019 1 2
 
OutPut:
61
2

解析:其实不太复杂,分清步骤来即可,详见代码。

代码:

#include <iostream>
using namespace std;
int IsLeapYear(int year)
{
    if((year%4==0&&year%100!=0)||year%400==0)
        return 1;
    else
        return 0;
}
int IsBigMon(int month)
{
    switch(month)
    {
    case 1:case 3:case 5:case 7:case 8:case 10:case 12:
        return 1;
    default:
        return 0;
    }
}
int Same_Year(int y1,int m1,int d1,int y2,int m2,int d2)
{
    int days=0;
    if(m1==m2)
        days+=d2-d1;
    else
    {
        if(IsBigMon(m1))
            days+=31-d1;
        else
        {
            if(m1==2)
            {
                if(IsLeapYear(y1))
                    days+=29-d1;
                else
                    days+=28-d1;
            }
            else
                days+=30-d1;
        }
        for(int i=m1+1;i<m2;i++)
        {
            if(IsBigMon(i))
                days+=31;
            else
            {
                if(i==2)
                {
                    if(IsLeapYear(y1))
                        days+=29;
                    else
                        days+=28;
                }
                else
                    days+=30;
            }
        }
        days+=d2;
    }
    return days;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int days=0;
        int y1,m1,d1,y2,m2,d2;
        cin>>y1>>m1>>d1>>y2>>m2>>d2;
        //第一步算中间整年的
        if(y1==y2)
            days=Same_Year(y1,m1,d1,y2,m2,d2);
        else
        {
            days+=Same_Year(y1,m1,d1,y1,12,31);
            for(int i=y1+1;i<y2;i++)
            {
                if(IsLeapYear(i))
                    days+=366;
                else
                    days+=365;
            }
            days+=Same_Year(y2,1,1,y2,m2,d2)+1;
        }
        cout<<days+1<<endl;
    }
    return 0;
}

2018西工大计算机复试机试题

1.求积:给定n组数,每组两个整数,输出这两个整数的乘积

Input:
2
1 1
2 3
 
Output:
1
6

2.阶乘:给定n组数,每组一个整数,输出该组数的阶乘;

Input:
2 
3 
5
 
Output:
6
120

3.C(n,m):求n个数中任取m个数的不同取法个数

Input:
10 3
 
Output:
120

4.给定n组数,每组m个,对每组数进行从小到大排序:

Input:
2 4
3 5 2 8
2 7 9 8
 
Output:
2 3 5 8
2 7 8 9

解析:以上题目过于简单,博主拒绝做/狗头保命/,第四题排序,见本文第一题

5.字符串反转:给定n组字符串,每组字符串不超过20,输出每组字符串的反串

Input:
3
nwpu
china
xi an
 
Output:
upwn
anihc
na ix

代码:

#include <iostream>
#include<string>
#include<stdio.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    getchar();
    while(n--)
    {
        string str;
        getline(cin,str);
        int len=str.size();
        for(int i=len-1;i>=0;i--)
            cout<<str[i];
        cout<<endl;
    }
    return 0; 
}

6.判断是否回文,包括空格、数字、英文、符号,若是输出yes,否则输出no;

Input:
4
nwpu
madam
1001
xi ix
 
Output:
no
yes
yes
yes

代码:

#include <iostream>
#include<string>
#include<stdio.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    getchar();
    while(n--)
    {
        string str;
        getline(cin,str);
        int len=str.size();
        int flag=1;
        for(int i=0;i<=len/2;i++)
        {
            if(str[i]!=str[len-i-1])
            {
                flag=0;
                break;
            }
        }
        if(flag==1)
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}

7.判断括号是否匹配:给定n组数,每组为一个字符串,测试三种括号:{}()[],且顺序都是前左括号,后右括号,括号之间可以嵌套。若匹配则输出yes,否则输出no;

Input:
2
{9}[00](tt)
{[](}
 
Output:
yes
no

解析:此题也不难,需要用到栈,说一下大体思想。建一个栈,将每个左括号存进去,遇到一个右括号就与栈顶元素比较,相对应就正确并且出栈,对应不上就出错。详见代码。

代码:

#include<iostream>
#include<string>
#include<stack>
#include<stdio.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    getchar();
    while(n--)
    {
        string str;
        stack<char>s;
        while(!s.empty())//清空栈
            s.pop();
        cin>>str;
        int len=str.size();
        int flag=1;
        for(int i=0;i<len;i++)
        {
            if(str[i]=='{'||str[i]=='['||str[i]=='(')
                s.push(str[i]);
            else if(str[i]=='}'||str[i]==']'||str[i]==')')
            {
                if(str[i]==')')
                {
                    if(s.top()=='(')
                        s.pop();
                    else
                    {
                        flag=0;
                        break;
                    }
                }
                if(str[i]==']')
                {
                    if(s.top()=='[')
                        s.pop();
                    else
                    {
                        flag=0;
                        break;
                    }
                }
                if(str[i]=='}')
                {
                    if(s.top()=='{')
                        s.pop();
                    else
                    {
                        flag=0;
                        break;
                    }
                }
            }
        }
        if(!s.empty())
            flag=0;
        if(flag==1)
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}

 

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值