西工大19年计算机机试真题

 

前言:西工大机试真题记录 

           代码在CodeBlocks16.01环境下编译通过 

 第一题-整数排序(快速排序)

/*
 *题目:一组整数,由小到大排序,有n组测试数据,排序输出
 *输入样例:
            2
            1 5 8 6 3 2 0
            4 2 3 8 15 63 20 1
  *输出:   0 1 2 3 5 6 8
            1 2 3 4 8 15 20 63
  */

#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;

int QuickSort(vector<int> &data, int left, int right)       //注意:此处要用引用传vector
{
    int temp, key = data[left], leftGuard = left, rightGuard = right;
    if  (left >= right)
    {
        return 0;
    }

    while (leftGuard < rightGuard)
    {
        while (leftGuard < rightGuard && data[rightGuard] >= key)
        {
            --rightGuard;
        }
        while (leftGuard < rightGuard && data[leftGuard] <= key)
        {
            ++leftGuard;
        }

        if (leftGuard < rightGuard)
        {
            temp = data[leftGuard];
            data[leftGuard] = data[rightGuard];
            data[rightGuard] = temp;
        }
    }
    data[left] = data[leftGuard];
    data[leftGuard] = key;

    QuickSort(data, left, leftGuard - 1);
    QuickSort(data, rightGuard + 1, right);

    return 0;
}

int NoOne()
{
    int num, length;
    char newLine;
    int inpt;
    vector<int> data;
    cin >> num;
    while (num--)
    {
        data.clear();
        do
        {
            cin >> inpt;
            data.push_back(inpt);
        }while ((newLine = getchar()) != '\n');

        length = data.size();
        QuickSort(data, 0, length - 1);

        for (int &i : data)
        {
            cout << i << " ";
        }
        cout << endl;
    }

    return 0;
}

第二题-海伦公式求三角形面积

/*
 *题目:利用海伦公式求三角形面积,是三角形输出面积(保留两位小数),否则输出NaN(注:海伦公式:S=sqrt(p(p-a)(p-b)(p-c)),其中p为半周长
 *输入样例:
            2
            3.0 4.0 5.0
            1.0 2.0 3.0
  *输出:
            6.00
            NaN
 */

#include <iostream>
#include <math.h>
#include <stdio.h>

using namespace std;

int NoTwo()
{
    int num;
    double edgeA, edgeB, edgeC, halfPeri, area;
    cin >> num;
    while (num--)
    {
        cin >> edgeA >> edgeB >> edgeC;
        if ((edgeA + edgeB > edgeC) && (edgeA + edgeC > edgeB) && (edgeB + edgeC) > edgeA)
        {
            halfPeri = (edgeA + edgeB + edgeC) / 2;
            area = sqrt((halfPeri * (halfPeri - edgeA) * (halfPeri - edgeB) * (halfPeri - edgeC)));
            printf("%0.2f\n", area);
        }
        else
        {
            cout << "NaN" << endl;
        }
    }
    return 0;
}

第三题-判断ip地址是否合法(题目要求是用string字符串输入,第一二种答案是网上的答案修改的,但是感觉不太符合题意,原本以为stl里有个自带的Split()函数,想不到居然没有,最后还是自己写了一个,包括stringstream的使用,是非常好用的类型转换)

/*
 *题目:判断ip地址是否合法,以字符串的形式输入,格式为a.b.c.d,每个均为整数,若每个数都在[0,255]之间,说明是合法的,输出yes,否则输出no
 *输入样例:
            2
            255.2.26.2
            1.2.333.4
 *输出:
            yes
            no
 */

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <stdio.h>
#include <string.h>

using namespace std;

vector<string> Split(const string &s, const string &dot)
{
    vector<string> result(4, "");
    int cnt = 0;
    int length = 0;
    int digit = 0;
    while (cnt < s.size())
    {
        length = 0;
        while (s[cnt] != dot[0] && cnt != s.size())
        {
            ++cnt;
            ++length;
        }
        for (int i = length; i > 0; --i)
        {
            result[digit] += s[cnt - i];
        }
        digit++;
        cnt++;
    }
    return result;
}

int NoThree()
{
    int num;
    string inpt;
    vector<string> strSplit;
    stringstream str2digit;
    int intNum;
    cin >> num;
    while (num--)
    {
        cin >> inpt;
        strSplit = Split(inpt, ".");
        for (int i = 0; i < 4; ++i)
        {
            str2digit << strSplit[i];
            str2digit >> intNum;
            if (intNum < 0 || intNum > 255)
            {
                cout << "no" << endl;
                str2digit.clear();
                return 0;
            }
            str2digit.clear();
        }
        cout << "yes" << endl;
    }
    return 0;


    /*************第一种**************************
    int n;
	scanf("%d",&n);
	while(n--){
		int a,b,c,d;
	        scanf("%d.%d.%d.%d",&a,&b,&c,&d);
                if(a>=0&&a<256&&b>=0&&b<256&&c>=0&&c<256&&d>=0&&d<256)
		        printf("yes\n");
                else
		        printf("no\n");
	}
    return 0;
    *************************************/

    /*************第二种*************************
    char str[31] = "\0", temp[31];
    int a, b, c, d;
    int num;
    cin >> num;
    getchar();                          //gets()会读取回车键,所以要用getchar()吸收回车键
    while (num--)
    {
        gets(str);
        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);
            if (strcmp(temp, str) == 0)
            {
                printf("yes\n");
            }
            else
            {
                printf("no\n");
            }
        }
        else
        {
            printf("no\n");
        }
    }
    return 0;
    ********************************************/
}

第四题-找质数

/*
 *题目:从m开始找出n个质数(如果m是,输出m)
 *输入样例:
            4 3
 *输出:
            5
            7
            11
 */

#include <iostream>
#include <math.h>

using namespace std;

int NoFour()
{
    int start, num, flag, key = 1;
    cin >> start >> num;
    while (key <= num)
    {
        flag = 0;
        for (int i = 2; i <= sqrt(start); ++i)
        {
            if (start % i == 0)
            {
                flag = 1;
                break;
            }
        }
        if (flag == 0)
        {
            cout << start << endl;
            ++start;
            ++key;
        }
        else
        {
            ++start;
        }
    }
    return 0;
}

 第五题-求任意两天日期差(用的是两个日期与公元0年1月1日的天数再相减,相当暴力)

/*
 *题目:求任意两天的日期差
 *输入样例:
            2
            2016 1 1 2016 3 1
            2019 1 1 2019 1 2
 *输出:
            61
            2
 */

#include <iostream>

using namespace std;

int NoFive()
{
    int num;
    int yearOne, yearTwo, monthOne, monthTwo, dayOne, dayTwo;
    int monDaysOne = 0;
    int monDaysTwo = 0;
    int leapYearsOne = 0;
    int nonleapYeardsOne = 0;
    int leapYearsTwo = 0;
    int nonleapYeardsTwo = 0;
    int sumDaysOne = 0;
    int sumDaysTwo = 0;
    cin >> num;
    while (num--)
    {
        cin >> yearOne >> monthOne >> dayOne >> yearTwo >> monthTwo >> dayTwo;
        switch(monthOne)
        {
        case 1:
            monDaysOne = 0;
            break;
        case 2:
            monDaysOne = 31;
            break;
        case 3:
            monDaysOne = 59;
            break;
        case 4:
            monDaysOne = 90;
            break;
        case 5:
            monDaysOne = 120;
            break;
        case 6:
            monDaysOne = 151;
            break;
        case 7:
            monDaysOne = 181;
            break;
        case 8:
            monDaysOne = 212;
            break;
        case 9:
            monDaysOne = 243;
            break;
        case 10:
            monDaysOne = 273;
            break;
        case 11:
            monDaysOne = 304;
            break;
        case 12:
            monDaysOne = 334;
            break;
        default:
            break;
        }
        switch(monthTwo)
        {
        case 1:
            monDaysTwo = 0;
            break;
        case 2:
            monDaysTwo = 31;
            break;
        case 3:
            monDaysTwo = 59;
            break;
        case 4:
            monDaysTwo = 90;
            break;
        case 5:
            monDaysTwo = 120;
            break;
        case 6:
            monDaysTwo = 151;
            break;
        case 7:
            monDaysTwo = 181;
            break;
        case 8:
            monDaysTwo = 212;
            break;
        case 9:
            monDaysTwo = 243;
            break;
        case 10:
            monDaysTwo = 273;
            break;
        case 11:
            monDaysTwo = 304;
            break;
        case 12:
            monDaysTwo = 334;
            break;
        default:
            break;
        }

        if (((yearOne % 4 == 0) && (yearOne % 100 != 0)) || (yearOne % 400 == 0))
        {
            if (monthOne > 2)
            {
                monDaysOne++;
            }
        }
        if (((yearTwo % 4 == 0) && (yearTwo % 100 != 0)) || (yearTwo % 400 == 0))
        {
            if (monthTwo > 2)
            {
                monDaysTwo++;
            }
        }

        for (int i = 0; i < yearOne; ++i)
        {
            if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0))
            {
                leapYearsOne++;
            }
        }
        nonleapYeardsOne = yearOne - leapYearsOne - 1;

        for (int j = 0; j < yearTwo; ++j)
        {
            if (((j % 4 == 0) && (j % 100 != 0)) || (j % 400 == 0))
            {
                leapYearsTwo++;
            }
        }
        nonleapYeardsTwo = yearTwo - leapYearsTwo - 1;

        sumDaysOne = leapYearsOne * 366 + nonleapYeardsOne * 365 + monDaysOne + dayOne;
        sumDaysTwo = leapYearsTwo * 366 + nonleapYeardsTwo * 365 + monDaysTwo + dayTwo;

        cout << sumDaysTwo - sumDaysOne + 1<< endl;
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值