前言:西工大机试真题记录
代码在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;
}