西工大计算机复试机试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
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;ia[j])
                {
                    int tmp=a[i];
                    a[i]=a[j];
                    a[j]=tmp;
                }
            }
        }
        for(i=0;i

(2)插入排序

#include 
#include
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=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

(3)快速排序

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

做法一:

#include 
#include
using namespace std;
int Partion(int a[],int i,int j)//每次返回被分的基值下标,下次分别排两边即可
{
    int tmp=a[i];//首元素作为基值
    while(ia[i])
            i++;
        if(i

做法二:

#include 
#include
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(ia[i])
            i++;
        if(i

(4)归并排序:

#include 
#include
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

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

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

代码:

#include 
#include
#include
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"<

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

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

代码:

#include 
#include
#include
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;i3)
                {
                    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"<

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

#include
#include
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 
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<

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

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

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

代码:

#include 
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>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

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 
#include
#include
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<

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

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

代码:

#include 
#include
#include
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"<

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

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

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

代码:

#include
#include
#include
#include
using namespace std;
int main()
{
    int n;
    cin>>n;
    getchar();
    while(n--)
    {
        string str;
        stacks;
        while(!s.empty())//清空栈
            s.pop();
        cin>>str;
        int len=str.size();
        int flag=1;
        for(int i=0;i

 

你可能感兴趣的:(西工大计算机复试机试,算法,c++)