PAT (Basic Level) 1051-1060

目录

1051 复数乘法

1052 卖个萌

1053 住房空置率

1054 求平均值

1055 集体照

1056 组合数的和

1057 数零壹

1058 选择题

1059 C语言竞赛

1060 爱丁顿数


1051 复数乘法

AC主要考察细节,比如:

(1)12、13行,如果-0.005<A<0,那么输出的就是-0.00而不是0.00,因此要进行处理;

(2)16行的判断条件,如果虚部为负就不用添加运算符号,若是正数要手动加+号。

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	double R1,R2,P1,P2,A,B;
	cin>>R1>>P1>>R2>>P2;
	A=R1*R2*cos(P1+P2);
	B=R1*R2*sin(P1+P2);
    
	if(A<0 && A>=-0.005) A=0;
	if(B<0 && B>=-0.005) B=0;
    
    printf("%.2lf",A);
    if(B>=0)
        printf("+%.2lfi",B);
    else
        printf("%.2lfi",B);
 } 

1052 卖个萌

(1)容器填充,考虑到中括号内元素不一定长度为1,因此设置start end存储;

(2)36行注意需要输出反斜杠时,源码中要写两个。

#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main()
{
    vector<vector<string>> v(3);
    string s[3];
    
    for(int i=0;i<3;i++)
        getline(cin,s[i]);
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<s[i].length();j++)
        {
            int start,end;
            if(s[i][j]=='[')
                start=j+1;
            if(s[i][j]==']')
            {
                end=j;
                string temp=s[i].substr(start,end-start);
                v[i].push_back(temp);
            }
        }
    }
    
    int n;
    cin>>n;
    while(n--)
    {
        int a,b,c,d,e;
        cin>>a>>b>>c>>d>>e;
        if(a>v[0].size()||b>v[1].size()||c>v[2].size()||d>v[1].size()||e>v[0].size()||a<1||b<1||c<1||d<1||e<1)
            cout<<"Are you kidding me? @\\/@"<<endl;
        else
            cout<<v[0][a-1]<<"("<<v[1][b-1]<<v[2][c-1]<<v[1][d-1]<<")"<<v[0][e-1]<<endl;
    }
}

1053 住房空置率

写的时候12和17行写顺手了写了while(N--),结果全错,因为N和n不能改动。

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    int N,d;
    double e;
    cin>>N>>e>>d;
    double may=0,certain=0;
    
    for(int i=0;i<N;i++)
    {
        int n;
        cin>>n;
        int counter=0;
        for(int j=0;j<n;j++)
        {
            double temp;
            cin>>temp;
            if(temp<e)
                counter++;
        }
        
        if(counter>n/2&&n>d)
        {
            certain++;
            continue;
        }
        
        if(counter>n/2)
            may++;
    }
    
    double may_rate=(may/N)*100.0;
    double certain_rate=(certain/N)*100.0;
    cout<<fixed<<setprecision(1)<<may_rate<<"% "<<certain_rate<<"%";
}

1054 求平均值

(1)注意几个不合法类型:

小数点出现了一次以上;

如果长度为1且仅有负号;

小数点后超过两位;

在区间之外;

负号出现了一次以上;

如果长度为1且仅有小数点;

(最后两种我写的时候也没有考虑到..)

(2)第42行的fabs()要记得添加cmath头文件;

(3)第57行的情况注意输出格式中,要写number而不是numbers不然测试点2会报错(说实话这里根本没想到,还是看的别人的题解才明白TT)(P.S.话说为什么0个都能用复数1个要用单数)。

#include<iostream>
#include<vector>
#include<cctype>
#include<cmath>
#include<iomanip>
using namespace std;

int main()
{
    int n;
    cin>>n;
    vector<double> v;
    while(n--)//判定以及填充容器过程
    {
        string s;
        cin>>s;
        int OneMinus=0;//是否仅有负号
        int point=0;//小数点个数
        int alpha=0;//字母个数
        int pos=0;//小数点位置
        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='-'&&s.length()==1)
                OneMinus++;
            if(s[i]=='.')
            {
                point++;
                pos=i+1;
            }
            if(isalpha(s[i]))
                alpha++;
        }
        
        if(OneMinus>0)
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//仅有负号不合法
        else if(alpha>0)
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//有字母不合法
        else if(point>1)
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//小数点大于一个不合法
        else if(point==1&&s.length()-pos>2)
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//多位小数不合法
        else if(fabs(stod(s))>1000)
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;//范围超过不合法
        else
        {
            double t=stod(s);
            v.push_back(t);
        }
    }
    
    double sum=0;
    for(auto x:v)
        sum+=x;
    cout<<"The average of "<<v.size();
	if(v.empty())
        cout<<" numbers is Undefined";
	else if(v.size()==1)
        cout<<fixed<<setprecision(2)<<" number is "<<sum/v.size();
	else
        cout<<fixed<<setprecision(2)<<" numbers is "<<sum/v.size();
}

1055 集体照

参考了这位博主的题解

主要难点应该填充output[m]的那块代码;

写的时候我又想当然地写了while(row--),结果测试点0和测试点4出错,因为row变量在执行段里用到了,这毛病最近犯好多次T^T。

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

struct info
{
    string name;
    int height;
};

bool cmp(info a,info b)
{
    if(a.height!=b.height)
        return a.height>b.height;
    else
        return a.name<b.name;
}

int main()
{
    int n,k;
    int m;
    cin>>n>>k;
    vector<info> student(n);
    for(int i=0;i<n;i++)
        cin>>student[i].name>>student[i].height;
    sort(student.begin(),student.end(),cmp);
    
    int t=0,row=k;
    while(row)
    {
        if(row==k)
            m=n-n/k*(k-1);//每排人数
        else
            m=n/k;
        vector<string> output(m);
        output[m/2]=student[t].name;
        //left
        int j=m/2-1;
        for(int i=t+1;i<t+m;i=i+2)
            output[j--]=student[i].name;
        //right
        j=m/2+1;
        for(int i=t+2;i<t+m;i=i+2)
            output[j++]=student[i].name;
        
        //output
        cout<<output[0];
        for(int i=1;i<m;i++)
            cout<<" "<<output[i];
        cout<<endl;
        t+=m;
        row--;
    }
}

1056 组合数的和

找出14行公式即可。

#include<iostream>
using namespace std;

int main()
{
    int n,a[10];
    cin>>n;
    int sum=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    sum=sum*(n-1)*11;
    cout<<sum;
}

1057 数零壹

字母先转小写再处理相加。

#include<iostream>
#include<cctype>
using namespace std;

int main()
{
    string s;
    int sum=0;
    int binary[2]={0};
    getline(cin,s);
    for(auto x:s)
        if(isalpha(x))
            sum=sum+tolower(x)-'a'+1;
    
    while(sum)
    {
        binary[sum%2]++;
        sum/=2;
    }
    
    cout<<binary[0]<<" "<<binary[1];
}

1058 选择题

(1)参考了这篇题解

(2)别忘了28行的getchar()。

#include<iostream>
#include<vector>
#include<set>
#include<cctype>
using namespace std;

int main()
{
    int N,M;
    cin>>N>>M;
    vector<set<char>> right(M);
    int score[M]={0};
    int WrongCnt[M]={0};
    
    for(int i=0;i<M;i++)
    {
        int s,o,r;//Score,OptionNum,RightNum
        cin>>s>>o>>r;
        for(int j=0;j<r;j++)
        {
            char rightans;
            cin>>rightans;
            right[i].insert(rightans);
        }
        score[i]=s;
    }
    
    getchar();
    for(int i=0;i<N;i++)
    {
        string s;
        int StuScore=0,counter=0;//counter代表题号
        getline(cin,s);
        set<char> stuans;
        for(auto x:s)
        {
            if(isalpha(x))
                stuans.insert(x);
            if(x==')')
            {
                if(stuans==right[counter])
                    StuScore+=score[counter];
                else
                    WrongCnt[counter]++;
                stuans.clear();
                counter++;
            }
        }
        cout<<StuScore<<endl;
    }
    
    int Max=-1;
    for(int i=0;i<M;i++)
        Max=max(Max,WrongCnt[i]);
    if(Max==0||Max==-1)
        cout<<"Too simple"<<endl;
    else
    {
        cout<<Max;
        for(int i=0;i<M;i++)
        {
            if(WrongCnt[i]==Max)
                cout << ' ' <<i+1;
        }
    }
}

1059 C语言竞赛

(1)思路:因为id是四位数字,所以创一个长度一万的数组,id作为下标内容是排名;

(2)35行要用printf限定长度,因为如果用cout不方便补前置0;

(3)isPrime()这个函数体中,第10行的for循环条件如果写i<sqrt(x),测试点2会报错;

(4)debug最久的点在于最终输出时,判定素数的部分如果你第6行没有考虑到0和-1不算素数,那要注意把这个if判定加在rank[i]==0和-1都判定完之后。

#include<iostream>
#include<vector>
using namespace std;
bool isPrime(int x)
{
    if(x<=1)
        return false;
    if(x==2)
        return true;
    for(int i=2;i<x;i++)
    {
        if((x%i)==0 )
            return false; 
    }
    return true;
}
int main()
{
    int N;
    cin>>N;
    int rank[10000]={0};
    for(int i=1;i<=N;i++)
    {
        int t;
        cin>>t;
        rank[t]=i;
    }
    
    int K;
    cin>>K;
    while(K--)
    {
        int t;
        cin>>t;
        printf("%04d: ",t);

        if(rank[t]==1)
        {
            cout<<"Mystery Award"<<endl;
            rank[t]=-1;
        }
        else if(isPrime(rank[t]))
        {
            cout<<"Minion"<<endl;
            rank[t]=-1;
        }
        else if(rank[t]==0)
            cout<<"Are you kidding?"<<endl;
        else if(rank[t]==-1)
            cout<<"Checked"<<endl;
        else
        {
            cout<<"Chocolate"<<endl;
            rank[t]=-1;
        }
    }
}

1060 爱丁顿数

水题。

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

int main()
{
	int n,i,j,max=0;
    cin>>n;
	int a[n+1];
	for(int i=1;i<=n;i++)
        cin>>a[i];
	sort(a+1,a+1+n);
    reverse(a+1,a+1+n);
	for(int i=1;i<=n;i++)
	{
		if(a[i]>i)
            max=i;
	}
	cout<<max;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值