西工大复试2016~2019整理真题整理

【重点】201601 小王围着操场跑圈,每次跑三圈,请输入行数,每行输入9个正整数,分别表示每次每一圈的分,秒,毫秒,
输出每次跑步所用的平均时间

分析:为了计算平均时间,需要求出跑三圈所用的总秒数,求出三次跑圈的总秒数后,再求出单次跑圈的平均秒数,利用单次跑圈的平均秒数求商,求余,得到单次跑圈的分,秒,毫秒

#include <iostream>
using namespace std;
struct Time
{
    int m,s,ms;
    int total;
};
int main()
{
    Time t[3];
    for(int i=0;i<3;i++)
    {
        cin>>t[i].m>>t[i].s>>t[i].ms;
        t[i].total = t[i].m * 60000 + t[i].s *1000 + t[i].ms;
    }
    int total = 0;
    for(int i=0;i<3;i++)
    {
        total += t[i].total;
    }
    total = total / 3;
    Time temp;
    temp.m = total /60000;
    temp.s = total %60000 /1000;
    temp.ms = total %1000;
    cout<<temp.m<<" "<<temp.s<<" "<<temp.ms;
    return 0;
}


201602 排序,输入n,有n组测试数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<int> a[n];
    int m;
    for(int i=0;i<n;i++)
    {
        while(1)
        {
            cin>>m;
            a[i].push_back(m);
            if(cin.get() == '\n') break;

        }
        sort(a[i].begin(),a[i].end());
    }
    for(int i=0;i<n;i++)
    {
        for(vector<int>::iterator it =a[i].begin();it != a[i].end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
    return 0;
}


201603 算术表达式
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n;
    cin>>n;
    double a[n];
    double b[n] = {0};
    for(int i=0;i<n;i++)
    {
        char c;
        cin>>a[0];
        c = getchar();
        int k =0 ;
        double ch;

        while(c != '\n')
        {
            cin>>ch;
            switch(c)
            {
                case '+': a[++k] =ch;break;
                case '-': a[++k] =-ch;break;
                case '*': a[k] *=ch;break;
                case '/': a[k] /=ch;break;
            }
            c = getchar();
        }
        for(int j=0;j<=k;j++)
        {
            b[i] += a[j];
        }
    }
    for(int i=0;i<n;i++)
    {
        if(abs(b[i] - int(b[i])<0.000001))
        {
            printf("%.0f\n",b[i]);
        }
        else
        {
            printf("%.1f\n",b[i]);
        }
    }
    return 0;
}


201604用海伦公式计算三角形面积
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int main()
{
    double a,b,c,p;
    cin>>a>>b>>c;
    p = (a+b+c)/2;
    if((a+b)>c&&(a-b)<c && (a+c)>b&&(a-c)<b && (b+c)>a&&(b-c)<a)
    {
        printf("%.2f",sqrt(p*(p-a)*(p-b)*(p-c)));
    }
    else
    {
        cout<<"0.00";
    }
    return 0;
}


201701 输入两组时间,计算平均时间
#include <iostream>
using namespace std;
int main()
{
    int a,b,c,a1,b1,c1;
    cin>>a>>b>>c>>a1>>b1>>c1;
    if(!(a+1==a1 || a == a1+1))
    {
         if(a == 0)
        {
            a = 12;
        }
        else if(a1 == 0)
        {
            a1 = 12;
        }
    }
    int t1,t2;
    t1  = a *3600 + b*60 +c;
    t2  = a1 *3600 + b1*60 +c1;
    t1 = (t1 + t2)/2;
    a = t1 / 3600;
    b = t1 %3600/60;
    c = t1 %60;

    cout<<a<<" "<<b<<" "<<c;
    return 0;
}


201702 排序,输入n,有n组测试数

总结:本题是对n组测试数,而不是一组,一定要看清题目
知识点1:
如何输入n组测试数为难点
for()
{
while(1)
{
cin>>m;
把m放入vector中
cin.get() == '\n’时,跳出循环
}
}
知识点2:
vector v;
定义的v变量的v.end()是指向最后一个数的后面

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<int> a[n];
    int m;
    for(int i=0;i<n;i++)
    {
        while(1)
        {
            cin>>m;
            a[i].push_back(m);
            if(cin.get() == '\n') break;

        }
        sort(a[i].begin(),a[i].end());
    }
    for(int i=0;i<n;i++)
    {
        for(vector<int>::iterator it =a[i].begin();it != a[i].end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
    return 0;
}


201703 输入行数n,再在每一行输出表达式,计算结果(重复)

201704.括号匹配,输入测试组n,接着n行实现n组测试

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    char c;
    string s;
    stack<int> vs;
    int flag =1 ;
    cin>>s;
    char x;
    for(int i=0;i<s.length();i++)
    {
        switch(s[i])
        {
            case '(': vs.push(s[i]);break;
            case '{': vs.push(s[i]);break;
            case '[': vs.push(s[i]);break;
            case ')': 
            x = vs.top();
                vs.pop();
                if(x != '(')  flag  = 0;
                break;
            case ']':
                x = vs.top();
                vs.pop();
                if(x != '[')  flag  = 0;
                break;
            case '}':
                x = vs.top();
                vs.pop();
                if(x != '{')  flag  = 0;
                break;
        }
    }
    if(!vs.empty())  flag = 0;
    if(flag == 1 )   cout<<"yes";
    else		 cout<<"no";
}

201801夏令营:输入三角形的三条边,判断它们能否构成三角形
提示:任意两边之和大于第三边,任意两边之差小于第三边
(简单)

#include <iostream>
using namespace std;
int main()
{
    double a,b,c;
    cin>>a>>b>>c;
    if((a+b)>c&&(a-b)<c && (a+c)>b&&(a-c)<b && (b+c)>a&&(b-c)<a)
    {
        cout<<"yes";
    }
    else
        cout<<"no";
    return 0;
}

201802夏:2.输入 n 组数据,其中每组数据长度为 m,进行升序排序

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    vector<int > v[2];
    int n;
    cin>>n;
    int t;
    for(int i=0;i<n;i++)
    {
        while(1)
        {
            cin>>t;
            v[i].push_back(t);
            if(cin.get() == '\n') break;
        }
        sort(v[i].begin(),v[i].end());
    }
    for(int i=0;i<n;i++)
    {
        for(vector<int>::iterator  it = v[i].begin();it != v[i].end();it++)
            cout<< *it<< " ";
        cout<<endl;
    }
    return 0;
}

【重点】201803夏令营:
北京时间和美国时间相差 16 小时,即美国时间比北京时间慢 16 小时,输入 n
组北京时间,每组有 5 个整型数据,分别表示年、月、日、小时、分钟,输出美
国时间,同时考虑闰年、前一月份等问题。

解题思路:
找特殊时刻:
小时:>15&&<24
日:1号
在1号的情况下,可以根据月求出前面的月份的天数
在1月的情况下:
年,月
不在一月的情况下
不在一号的情况下
日减1



版本2:

```cpp
#include <iostream>
#include <vector>
using namespace std;
struct Time
{
    int ye,mo,da,ho,mi;
};
int main()
{
    Time t;
    int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    cin>>t.ye>>t.mo>>t.da>>t.ho>>t.mi;
    if(t.ye%400==0 || (t.ye/100!=0&&t.ye%4==0))
    {
        days[2] +=1;
    }
    if(t.da==1)
        if(t.mo == 1)
        {
            if(t.ho<16)
            {
                t.ye -=1;
                t.mo = 12;
                t.da = 31;
                t.ho = 24+t.ho-16;
            }
            else
                t.ho -=16;
        }
        else
        {
            if(t.ho<16)
            {
                t.mo -= 1;
                t.da = days[t.mo];
                t.ho = 24+t.ho-16;
            }
            else
                t.ho -=16;
        }
    else
    {
        if(t.ho<16)
        {
            t.da -= 1;
            t.ho = 24+t.ho-16;
        }
        else
            t.ho -=16;
    }
    printf("%d %05d %05d %02d %02d",t.ye,t.mo,t.da,t.ho,t.mi);
    return 0;
}

201804夏:4.运用求根公式求一元二次方程的解, 若无解,输出“NaN”,有解则输出结果,
保留两位小数,四舍五入。

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    double a,b,c;
    cin>>a>>b>>c;
    if((b*b - 4*a*c)>0)
    {
        printf("%.2f %.2f",(-b+sqrt(b*b-4*a*c))/(2*a),(-b-sqrt(b*b-4*a*c))/(2*a));
    }
    else if(!(b*b - 4*a*c))
    {
        printf("%.2f %.2f",(-b)/(2*a),(-b)/(2*a));
    }
    else
        cout<<"NaN";
    return 0;
}
201801
#include <iostream>
using namespace std;

int main()
{
   int n;
   cin>>n;
   int a,b;
   int num[n];
   for(int i=0;i<n;i++)
   {
        cin>>a>>b;
        num[i] = a*b;
   }
   for(int i=0;i<n;i++)
   {
       cout<<num[i]<<endl;
   }
}

201802
#include <iostream>

using namespace std;
int main()
{
    int n;
    cin>>n;
    int b[n];
    int data;
    for(int i =0;i<n;i++)
    {
        cin>>data;
        b[i]=1;
        for(int j=data;data>0;data--)
        {
           b[i] *=data ;
        }
    }
    for(int i=0;i<n;i++)
    {
        cout<<b[i]<<endl;
    }
    return 0;
}

201803
#include <iostream>

using namespace std;
int jcheng(int n);
int main()
{
    int n,m;
    cin>>n>>m;
    cout<< (jcheng(n)/(jcheng(m)*jcheng(n-m)));
    return 0;
}
int jcheng(int n)
{
    int sum=1;
    for(int i=n;i>0;i--)
    {
        sum *=i;
    }
    return sum;
}

201804
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n,m;
    cin>>n>>m;
    vector<int> v[n];
    int t;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>t;
            v[i].push_back(t);
        }
        sort(v[i].begin(),v[i].end());
    }
    for(int i=0;i<n;i++)
    {
        for(vector<int>::iterator it=v[i].begin();it!=v[i].end();it++)
            cout << *it<<" " ;
         cout<<endl;
    }
    return 0;
}

【重点】201805字符串反转:指定n组字符穿,每组字符串个数不超过20,输出每组字符串的反串
重点在于xi an如何接收

#include <iostream>
#include <string>
using namespace std;
string myreverse(string s);
int main()
{
    int n;
    cin>>n;
    string str[n];
    getchar();
    for( int i=0;i<n;i++)
    {
        getline(cin,str[i]);
        str[i] = myreverse(str[i]);
    }
    for(int i=0;i<n;i++)
    {
        cout<<str[i]<<endl;
    }
    return 0;
}
string myreverse(string s)
{
    char temp;
    for(unsigned int i=0;i<s.length()/2;i++)
    {
        temp = s[i];
        s[i] =  s[s.length()-1-i];
        s[s.length()-1-i] = temp;
    }
    return s;
}

【重点】201806判断回文
在这里插入图片描述

#include <iostream>

using namespace std;
bool judge(string s);
int main()
{
    int n;
    cin>>n;
    string str[n];
    getchar();
    for(int i=0;i<n;i++)
    {
        getline(cin,str[i]);
    }
    for(int i=0;i<n;i++)
    {
        if(judge(str[i]))
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}
bool judge(string s)
{
    unsigned int i=0;
    for(i=0;i<s.length()/2;i++)
    {
        if(s[i] != s[s.length()-1-i])
        {
            return false;
        }
    }
    return true;
}

结果:
在这里插入图片描述


【重点】201807 判断括号是否匹配:给定n组数,每组为一个字符串,测试三种括号:
在这里插入图片描述

#include <iostream>
#include <stack>
#include <vector>

using namespace std;
bool judge(string str);
int main()
{
    int n;
    cin>>n;
    string str[n];
    for(int i=0;i<n;i++)
    {
        cin>>str[i];
    }
    for(int i=0;i<n;i++)
    {
        if(judge(str[i]))
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}
bool judge(string str)
{
    stack<char> s;
    for(unsigned int i=0;i<str.length();i++)
    {
        switch(str[i])
        {
            case '{':
            s.push(str[i]);break;
            case '(':
            s.push(str[i]);break;
            case '[':
            s.push(str[i]);break;

            case '}':
            if('{' != s.top())
                return false;
            s.pop();
            break;

            case ')':
            if('(' != s.top())
                return false;
                s.pop();
            break;

            case ']':
            if('[' != s.top())
                return false;
            s.pop();
            break;
        }
    }
    if(!s.empty())
        return false;
    else
        return true;
}

结果:
在这里插入图片描述


【重点】201903 判断IP地址是否合法,N行,以字符串形式输入,格式为a.b.c.d,每个均为整数,输出判断是否为ip,每个数均在【0,255】之间,是输出yes,否no

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
vector<int> split(string str, string pattern);
bool Judge(vector<int> v);
int main()
{
    int n;
    cin>>n;
    string s[n];
    for(int j=0;j<n;j++)
    {
        cin>>s[j];
    }
    for(int j=0;j<n;j++)
    {
        vector<int> v = split(s[j],".");
        if(Judge(v))
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}
/*
****vector<int> split(string str,string pattern)****
由于char *strtok(char *str,char *delim);
所以split主要做两件事:
1.将string类型的str转化为char *
2.通过strtok(char *str,char *delim),通过第二个参数,将str裂解为四个int类型的数值,放到vector数组中
*/
vector<int> split(string str,string pattern)
{
    char * strc = new char[strlen(str.c_str())+1];
    strcpy(strc, str.c_str());
    vector<int> resultVec;
    char* tmpStr = strtok(strc, pattern.c_str());
    while (tmpStr != NULL)
    {
        resultVec.push_back(atoi(string(tmpStr).c_str()));
        tmpStr = strtok(NULL, pattern.c_str());
    }
    delete[] strc;
    return resultVec;
}
bool Judge(vector<int> v)//判断v存放的四个int类型的变量是否都在【0,255】
{
    for(unsigned int j=0;j<v.size();j++)
    {
        if(!(0<=v[j]&&v[j]<=255))
        {
            return false;
        }
    }
    return true;
}

结果:
在这里插入图片描述


【重点】:201905一年中任意两天差值。输入N组数测试。(保证后一天日期晚于前一天)输出期间天数。
在这里插入图片描述
解题思路:
先判断是否为闰年,闰年二月为29天。
本题要求两组数值在一年内,所以输入的两组数,
若月份相同,天数直接求,
若月份不同,写一个循环,计算从从前面的月份,到后面月份所有的天数加起来即可。

#include <iostream>
using namespace std;
struct time
{
    int y,m,d;
};
int main()
{
    int N;
    cin>>N;
    struct time t[N][2];
    int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int result[N]={0};
    for(int i=0;i<N;i++)
    {
        cin>>t[i][0].y>>t[i][0].m>>t[i][0].d>>t[i][1].y>>t[i][1].m>>t[i][1].d;
    }
    for(int i=0;i<N;i++)
    {
        if(t[i][0].y % 400 == 0 ||(t[i][0].y % 4==0 && t[i][0].y % 100!=0))
            days[1] =29;
        else
            days[1] = 28;

        if(t[i][0].m == t[i][1].m)
        {
            result[i] = t[i][1].d - t[i][0].d+1;
         }
         else
         {
             for(int k=t[i][0].m-1;k<t[i][1].m-1;k++)//1——12月在数组中表示为0~11
             {
                result[i] +=days[k];
             }
             result[i]= result[i] - t[i][0].d+1+t[i][1].d;
         }
    }
    for(int i=0;i<N;i++)
    {
        cout<<result[i]<<endl;
    }
    return 0;
}

在这里插入图片描述

2010Catalan数
算法思想:根据表达式写递归,再进行调用即可
f = 0,1
f(n) = f(0)f(n-1) + …+ f(n-1)f(0);

#include <iostream>

using namespace std;

int Catalan(int c)
{
    if(c == 0)
    {
        return 1;
    }
    else if( c == 1 )
    {
        return 1;
    }
    else
    {
        int sum =0 ;
        for(int i=0;i<c;i++)
        {
            sum  = sum + Catalan(i)*Catalan(c-i-1);
        }
        return sum;
    }
}
int main()
{
    int n;
    cin>>n;
    cout<<Catalan(n);
    return 0;
}

2009 正方形
解题思路:
输入四个点后,需要计算四个点的距离,由于四个不一定是按顺序输入,所以需要对这四个点进行排序,让横坐标递增,纵坐标递减

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct point
{
    double x;
    double y;
};
bool cmp(point a,point b)
{
    if(a.x!=b.x)
        return a.x<b.x;//X升序
    else
        return a.y>b.x;//Y逆序
}
double d(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool Isrec(point a,point o,point b)
{
    double temp = (a.x-o.x)*(b.x-o.x) + (a.y-o.y)*(b.y-o.y);
    if(temp == 0)
        return true;
    return false;
}
int main()
{
    point p[4];
    for(int i=0;i<4;i++)
        cin>>p[i].x>>p[i].y;
    sort(p,p+4,cmp);
    double dd[4];
    dd[0] = d(p[0],p[2]);
    dd[1] = d(p[2],p[3]);
    dd[2] = d(p[3],p[1]);
    dd[3] = d(p[1],p[0]);

    if(dd[0]==dd[1]&&dd[1]==dd[2]&&dd[2]==dd[3]&&Isrec(p[0],p[2],p[3]))
    {
        cout<<"YES";
    }
    else
        cout<<"No";
    return 0;
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值