乙级PAT1011-1015答案详解与重要知识点(2021.9.21-2021.9.26)

文章目录

    • 1011
    • 1012
    • 1013
    • 1014
    • 1015

1011

#include
using namespace std;

struct num{
     
    double A;
    double B;
    double C;
    string result;
}num[10];
int main(){
     
    int T;
    cin>>T;
    for(int i=0;i<T;i++){
     
        cin>>num[i].A>>num[i].B>>num[i].C;
    }
    for(int i=0;i<T;i++){
     
        if(num[i].A+num[i].B>num[i].C)
            num[i].result="true";
        else
            num[i].result="false";
    }
    for(int i=0;i<T;i++){
     
        cout<<"Case #"<<i+1<<": "<<num[i].result;
        if(i!=T-1)
        cout<<endl;
    }
}

1.基本数据类型的数据范围

int类型(四个字节):-231~231-1;long类型(八个字节):-263~-263-1
float类型(四个字节);double类型(八个字节)

1012

#include
#include
using namespace std;
int main()
{
     
    int N;
    cin>>N;
    int num[N];
    float A[5]={
     0};
    for(int i=0;i<N;i++)
        cin>>num[i];
    for(int i=0;i<N;i++){
     
        if(num[i]%10==0)
        A[0]=A[0]+num[i];
    }
    if(A[0]==0)A[0]=-1;
    int flag1=0;//标志是否有该类型的数据
    int flag2=0;//标志该数据是加还是减
    for(int i=0;i<N;i++){
     
        if(num[i]%5==1){
     
        flag1=1;
        if(flag2%2==0){
     
            A[1]=A[1]+num[i];
            flag2++;
        }   
        else{
     
            A[1]=A[1]-num[i];
            flag2++;
        }
        }     
    }        
    if(flag1==0)
    A[1]=-1;

    for(int i=0;i<N;i++){
     
        if(num[i]%5==2)
        A[2]++;
    }
    if(A[2]==0)A[2]=-1;
    int temp=0;
    for(int i=0;i<N;i++){
     
        if(num[i]%5==3){
     
            A[3]=A[3]+num[i];
            temp++;
        }
    }
    if(A[3]==0)
        A[3]=-1;
    else 
        A[3]=A[3]/temp;
    for(int i=0;i<N;i++){
     
        if(num[i]%5==4){
     
            if(num[i]>A[4])
                A[4]=num[i];
        }
    }

    for(int i=0;i<5;i++){
     
        if(A[i]==-1)
            cout<<'N';
        else if(i==3)
            printf("%.1f",A[i]);
        else
            cout<<A[i];
        if(i!=4)
            cout<<' ';
    }

    return 0;
}

1.printf格式化输出

(1)整数

d格式:用来输出十进制整数。有以下几种用法:

%d:按整型数据的实际长度输出。
%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出
%-md:m为指定的输出字段的宽度。如果数据的位数小于m,则右端补以空格,若大于m,则按实际位数输出
%0md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以’0’,若大于m,则按实际位数输出

(2)浮点数

f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:

%f:不指定宽度,整数部分全部输出并输出6位小数。
%.nf:其中有n位小数,数值宽度不变
%m.nf:输出共占m列,其中有n位小数,若数值宽度小于m左端补空格。
%-m.nf:输出共占m列,其中有n位小数,若数值宽度小于m右端补空格。

(3)字符串

s格式:用来输出一个串。有几中用法

%s:例如:printf("%s", “CHINA”)输出"CHINA"字符串(不包括双引号)
%ms:输出的字符串占m列,如果字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。

2.判断语句

若第一个if判断为真,则执行完语句1就退出该判断体,不再执行后面的else if和else,即使elseif也为真也不执行。

if(){
     
    //语句1
}
else if(){
     
    //语句2
}
else{
     
    //语句3
}

1013

#include
#include
#include
using namespace std;
bool isPriem(int num){
     
    if(num==1||num==4)
        return 0;
    else if(num==2||num==3)
        return 1;
    if(num%2==0)
        return 0;
    int temp=sqrt(num);
    for(int i=3;i<=temp+1;i+=2)
        if(num%i==0)
            return 0;
    return 1;
}

int main(){
     
    int m,n;
    int sum=0;
    int p[10000];
    cin>>m>>n;
    for(int i=1;sum<10000;i++){
     
        if(isPriem(i)){
     
            p[sum]=i;
            sum++;
        }    
    }
    for(int i=m-1;i<=n-1;i++){
     
        cout<<p[i];
        if(i==n-1)
            break;
        if((i-(m-1)+1)%10==0)
            cout<<endl;
        else
            cout<<' ';
    }
}

1014

#include
#include
using namespace std;

int main(){
     
    char c[3];
    int c2;
    int flag1=0;
    string s1,s2,s3,s4;
    cin>>s1>>s2>>s3>>s4;
    int l1,l2,l3,l4;
    l1=s1.size();
    l2=s2.size();
    l3=s3.size();
    l4=s4.size();
    for(int i=0;i<min(l1,l2);i++){
     
        if(!(s1[i]>='A'&&s1[i]<='G'))
            continue;
        if(!(s2[i]>='A'&&s2[i]<='G'))
            continue;
           if(s1[i]==s2[i]){
     
                c[0]=s1[i];
                flag1=i;
                break;
            }
        
    } 
    for(int i=flag1+1;i<min(l1,l2);i++){
     
        if(!((s1[i]>='A'&&s1[i]<='N')||(s1[i]>='0'&&s1[i]<='9')))
            continue;
        if(!((s2[i]>='A'&&s2[i]<='N')||(s2[i]>='0'&&s2[i]<='9')))
            continue;
          if(s1[i]==s2[i]){
     
                c[1]=s1[i];
                break;
            }
        }      
        for(int i=0;i<min(l3,l4);i++){
     
            if(!((s3[i]>='A'&&s3[i]<='Z')||(s3[i]>='a'&&s3[i]<='z')))
                continue;
            if(!((s4[i]>='A'&&s4[i]<='Z')||(s4[i]>='a'&&s4[i]<='z')))
                continue;
                if(s3[i]==s4[i]){
     
                    c2=i;
                    break;
                }
        }
    //cout<
    switch(c[0]-'A'){
     
        case 0:cout<<"MON ";break;
        case 1:cout<<"TUE ";break;
        case 2:cout<<"WED ";break;
        case 3:cout<<"THU ";break;
        case 4:cout<<"FRI ";break;
        case 5:cout<<"SAT ";break;
        case 6:cout<<"SUN ";break;
    }

    if(c[1]>='0'&&c[1]<='9')
        printf("%02d:",c[1]-'0');
    else
        cout<<c[1]-'A'+10<<':';
    
    printf("%02d",c2);

    return 0;
}

1015

#include
using namespace std;

struct st{
     
    string xh;
    int de;
    int cai;
    int sum;
};
bool cp(st a,st b){
     
    if( a.sum!=b.sum) 
        return  a.sum> b.sum;
    if(a.de != b.de ) 
        return a.de>b.de;
    if(a.xh!=b.xh)
	    return a.xh<b.xh;
    return false;
}
int main(int argc, char const *argv[])
{
     
    int n,l,h;
    cin>>n>>l>>h;
    st std0;
    vector<st> std[4];
    int sum=0;
    for(int i=0;i<n;i++){
     

        cin>>std0.xh>>std0.de>>std0.cai;
        std0.sum=std0.de+std0.cai;
        if(std0.de>=h&&std0.cai>=h)
            std[0].push_back(std0);
        else if(std0.de>=h&&std0.cai>=l)
            std[1].push_back(std0);
        else if(std0.de>=l&&std0.cai>=l&&std0.de>=std0.cai)
            std[2].push_back(std0);
        else if(std0.de>=l&&std0.cai>=l)
            std[3].push_back(std0);
        else
            sum++;
    }
    cout<<n-sum<<endl;
    for(int i=0;i<4;i++){
     
        sort(std[i].begin(),std[i].end(),cp);
        for(int j=0;j<std[i].size();j++){
     
            cout<<std[i][j].xh<<" ";
            cout<<std[i][j].de<<" ";
            cout<<std[i][j].cai;
            cout<<endl;
        }
    }
    return 0;
}

1.多关键字比较sort(start,end,cmp)

start、end为数据的位置,sort对start到end-1进行排序。
cmp为自定义bool返回值的函数。

//多关键字排序,先对sum进行降序,再对de进行降序,在对xh进行升序
struct st{
     
    string xh;
    int de;
    int cai;
    int sum;
};
bool cmp(st a,st b){
     
    if( a.sum!=b.sum) 
        return  a.sum> b.sum;
    if(a.de != b.de ) 
        return a.de>b.de;
    if(a.xh!=b.xh)
	    return a.xh<b.xh;
    return false;
}
st std[10];
sort(std,std+10,cmp)

2.可以用一个变量来暂存输入的数据,在一个循环中边输入边判断(省时省空间);也可以用数组在一个循环里输入数据,再在另一个循环里判断(费时费空间)

3.题目要求结尾无空行,可以在最后一个数据输出时有cout<,不会造成格式错误(因为endl只是结束该行,并不会输出一个空行)。但题目要求结尾无空格则不行。

你可能感兴趣的