天梯赛训练3

判断素数 (10分)

本题是水题,不过有个点很坑,就是对1的判断,写函数的时候要特判一下1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
bool isprime(ull a)
{
    ll i;
    if(a==1)
        return false;
    if(a==2)
        return true;
    for(i = 2;i <= sqrt(a)+1;i++)
    {
        if(a%i==0)
            return false;
    }
    return true;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        ull a;
        cin>>a;
        if(isprime(a))
            cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}
​```

7-2 寻找250 (10分)

思路:用EOF来进行输入,如果碰到第一个250就输出,并且标记一下,以后碰到250就不输出了。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    int cnt = 0;
    int flag = 0;
    while(~scanf("%d",&n))
    {
        if(n==250&&flag==0)
        {
            cout<<++cnt<<endl;
            flag = 1;
        }
        else cnt++;
    }

}

7-3 幸运彩票(15分)

思路:只要判断前三位数和后三位数的和相等就行

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string t;
        cin>>t;
        if(t[0]+t[1]+t[2]==t[3]+t[4]+t[5])
            cout<<"You are lucky!"<<endl;
        else cout<<"Wish you good luck."<<endl;
    }
}

7-4 出生年(15分)

思路:这道题关键是在判断这个数字有几个数字是一样的,然后从起始年份开始加一循环,碰到符合条件的就跳出输出。

#include<bits/stdc++.h>
using namespace std;

int check(int n)
{
int num[10]={0};
    int a = n/1000;
    int b = n/100%10;
    int c = n/10%10;
    int d = n%10;
    num[a]++;
    num[b]++;
    num[c]++;
    num[d]++;
    if(num[a]==4||num[b]==4||num[c]==4||num[d]==4)
        return 1;
    if(num[a]==3||num[b]==3||num[c]==3||num[d]==3)
        return 2;
    if(num[a]==1&&num[b]==1&&num[c]==1&&num[d]==1)
        return 4;
    if(num[a]==1||num[b]==1||num[c]==1||num[d]==1)
        return 3;
    else
        return 2;
}
int main()
{
    int y,n,i;
    cin>>y>>n;
    for(i=0;;i++)
    {
        if(check(y+i)==n)
            break;
    }
    printf("%d %04d",i,y+i);
}

7-5 敲笨钟(20分)

思路:逗点和句点是寻找的关键,find函数来判断有没有ong,如果有就往前数三个字符变成qiaobenzhong。

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
    int n;
    cin>>n;

    while(n--)
    {
        int flag1 = 0,flag2 = 0;
        int p1 = 0,p2 = 0;
        string s[101];
        int cnt = 0;
        while(1)
        {
            cin>>s[cnt++];
                if(s[cnt-1].find(".")!=-1)
                    break;
        }
        for(int i = 0;i < cnt;i++)
        {
            if(s[i].find(",")!=-1)
            {
                if(s[i].find("ong,")!=-1)
                {
                    flag1 = 1;
                    p1 = i;
                }
            }
            if(s[i].find(".")!=-1)
            {
                if(s[i].find("ong.")!=-1)
                {
                    flag2 = 1;
                    p2 = i;
                }
            }
        }
        if(flag1*flag2==0)
            cout<<"Skipped"<<endl;
        else
        {
            s[p2] = "zhong.";
            s[p2-1] = "ben";
            s[p2-2] = "qiao";
            for(int i = 0;i < cnt;i++)
        {
            cout<<s[i];
            if(i!=cnt-1)
                cout<<" ";

        }
        cout<<endl;
        }


    }
}

7-6 日期格式化(5分)

水题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int a,b,c;
    char x;
    cin>>a>>x>>b>>x>>c;
   printf("%d-%02d-%02d\n",c,a,b);
}

7-7 A-B(20分)

思路:双重遍历,便历每一个a中的字符,看看b里面有没有相同的,如果有,那就不输出,如果没有就输出这个字符。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    int l = b.length();
    int i = 0,j = 0;
    while(a[i]!='\0')
    {
        for(j = 0;j < l;j++)
        {
            if(a[i]==b[j])
            {
                break;
            }

        }
        if(j==l)
        {
            cout<<a[i];
        }
        i++;
    }
    cout<<endl;
}

7-8 计算指数(5分)

pow函数直接输出。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    int l = b.length();
    int i = 0,j = 0;
    while(a[i]!='\0')
    {
        for(j = 0;j < l;j++)
        {
            if(a[i]==b[j])
            {
                break;
            }

        }
        if(j==l)
        {
            cout<<a[i];
        }
        i++;
    }
    cout<<endl;
}

7-9 抢红包(25分)

思路:模拟即可,用结构体来表示每个人的序号,钱数。然后排序输出。

#include<bits/stdc++.h>
using namespace std;
typedef struct
{
    int no;
    double money;
    int cnt;
}person;
person p[10001];
bool cmp(person a,person b)
{
    if(a.money==b.money)
    {
        return a.cnt>b.cnt;
    }
    else
    return a.money>b.money;
}
int main()
{
    int n;
    cin>>n;
    int t = n;
    for(int i = 1;i <= n;i++)
    {
        p[i].no = i;
        p[i].money = 0;
        p[i].cnt = 0;
    }
    for(int j = 1;j<=n;j++)
    {
        int k;
        cin>>k;

        for(int i = 1;i <= k;i++)
        {
            int no;
            double m;
            cin>>no>>m;
            p[j].money-=m;
            p[no].money+=m;
            p[no].cnt++;
        }
    }sort(p+1,p+1+t,cmp);
    for(int i = 1;i <=t ;i++)
    {
        cout<<p[i].no<<" ";
        printf("%.2lf\n",p[i].money/100);
    }
}

7-10 互评成绩(25分)

模拟

#include<bits/stdc++.h>
using namespace std;
double a[10001];
bool cmp(double a,double b)
{
    return a>b;
}
int main()
{
    int n,k,m;
    cin>>n>>k>>m;
    int cnt = 1;
    while(n--)
    {
        double t[k+1];
        int i;double sum = 0;
        for(i = 1;i <= k;i++)
        {
            cin>>t[i];
            sum+=t[i];
        }
        sort(t+1,t+1+k);
        sum=sum-t[1]-t[k];
        a[cnt++] = sum/(k-2);

    }
    sort(a+1,a+1+cnt,cmp);
    for(int i = 1;i<=m;i++)
    {
        printf("%.3lf",a[m-i+1]);
        if(i!=m)
            cout<<" ";
    }
    cout<<endl;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务