乙级PAT1016-1020答案详解与重要知识点(2021.9.27-2021.10.2)

文章目录

    • 1016
    • 1017
    • 1018
    • 1019
    • 1020

1016

#include
using namespace std;

int main(){
     
    string a,b;
    int d1,d2;
    int n1,n2;
    int p1,p2;
    n1=n2=0;
    p1=p2=0;
    cin>>a>>d1;
    cin>>b>>d2;
    for(int i=0;i<a.size();i++){
     
        if(a[i]-'0'==d1)
            n1++;
    }
    for(int i=0;i<b.size();i++){
     
        if(b[i]-'0'==d2)
            n2++;
    }
    for(int i=0;i<n1;i++){
     
        p1=p1*10+d1;
    }
    for(int i=0;i<n2;i++){
     
        p2=p2*10+d2;
    }
    cout<<p1+p2;
}

1017

#include
using namespace std;

int main(int argc, char const *argv[])
{
     
    //a被除数,b除数,q商,r余数
    string a;
    vector<int> q;
    int b,r=0;
    cin>>a;
    cin>>b;
    int i=0;
    if((a[0]-'0')%b==(a[0]-'0')){
     
        r=a[0]-'0';
        i=1;
    }
    for(;i<a.size();i++){
     
        int a1=a[i]-'0'+r*10;
        q.push_back(a1/b);
        r=a1%b; 
    }
    if(q.empty())
        cout<<0;
    for(int i=0;i<q.size();i++)
        cout<<q[i];
    cout<<' '<<r;
    return 0;
}

1.大数的除法
先判断大数第一位数能否除以除数,若不能即商为0,则记录该位的余数但不记录(输出)该位的商,
若能除即商不是0,则记录余数并记录(输出)商;
再创建循环将上一位余数作为下一位除法的十位数,此时用容器记录每一位的商(或直接输出商),并记录余数给下一位用。

1018

#include
using namespace std;

struct ren{
     
    char ss;
    int w=0;
    int p=0;
    int l=0;
    int b=0;
    int c=0;
    int j=0;
    
}jia,yi;
int main(int argc, char const *argv[])
{
     
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
     
        cin>>jia.ss>>yi.ss;
        if(jia.ss=='B'&&yi.ss=='C'||jia.ss=='C'&&yi.ss=='J'||jia.ss=='J'&&yi.ss=='B'){
     
            jia.w++;
            yi.l++;
            switch (jia.ss)
            {
     
            case 'B':jia.b++;break;
            case 'C':jia.c++;break;
            case 'J':jia.j++;break;
            }
        }
        else if(yi.ss=='B'&&jia.ss=='C'||yi.ss=='C'&&jia.ss=='J'||yi.ss=='J'&&jia.ss=='B'){
     
            yi.w++;
            jia.l++;
            switch (yi.ss)
            {
     
            case 'B':yi.b++;break;
            case 'C':yi.c++;break;
            case 'J':yi.j++;break;
            }
        }
        else{
     
            jia.p++;
            yi.p++;
        }

    }
    cout<<jia.w<<' '<<jia.p<<' '<<jia.l<<endl;
    cout<<yi.w<<' '<<yi.p<<' '<<yi.l<<endl;
    if(max(max(jia.b,jia.c),jia.j)==jia.b)
        cout<<"B ";
    else if(max(max(jia.b,jia.c),jia.j)==jia.c)
        cout<<"C ";
    else
        cout<<"J ";
    if(max(max(yi.b,yi.c),yi.j)==yi.b)
        cout<<"B";
    else if(max(max(yi.b,yi.c),yi.j)==yi.b)
        cout<<"C";
    else
        cout<<"J";
    return 0;
}

1.三个数比大小:max(max( ,),)

1019

#include
using namespace std;
bool cmp(int a,int b){
     //降序
    return a>b;
}
int toNumber(int a[],int l){
     
    int num=0;
    for(int i=0;i<l;i++){
     
        num=num*10+a[i];
    }
    return num;
}
void toArray(int num,int a[],int l){
     
    for(int i=l-1;i>=0;i--){
     
        a[i]=num%10;
        num=num/10;
    }
}
int main()
{
     
	int array_n[4],n=0;
	cin>>n;
    toArray(n,array_n,4);
    sort(array_n,array_n+4,cmp);
    int jx=toNumber(array_n,4);
    sort(array_n,array_n+4);
	int sx=toNumber(array_n,4);
    if(jx-sx==0){
     
        printf("%04d",jx);
        cout<<" - ";
        printf("%04d",sx);
        cout<<" = "<<"0000"<<endl;
    }
    else{
     
    while(jx-sx!=6174){
     
        printf("%04d",jx);
        cout<<" - ";
        printf("%04d",sx);
        cout<<" = ";
        printf("%04d",jx-sx);
        cout<<endl;
        toArray(jx-sx,array_n,4);
        sort(array_n,array_n+4,cmp);
        jx=toNumber(array_n,4);
        sort(array_n,array_n+4);
	    sx=toNumber(array_n,4);
    }
    printf("%04d",jx);
    cout<<" - ";
    printf("%04d",sx);
    cout<<" = ";
    printf("%04d",jx-sx);
    cout<<endl;
    }
	return 0;
}

1.数组长度计算 sizeof()

int n[4]={'1','2','5','6'};
cout<

2.字符串string补上前置字符

string s;
cin>>s;             
s.insert(0,4-s.size(),'0');//这里用于补充前置零至4位数 
//s.insert(size_typepos, size_typen,  charTc); //从pos开始向后添加n个字符c

3.do{}while();while(){}的区别
while先判断后执行,do while先执行后判断;
当不满足循环条件时,while循环一次都不会执行,do while循环已经执行了一次不满足循环条件的内容;
在一些情况下,do while循环可以减少代码量(例如PATB1019)

1020

#include
using namespace std;
struct yb{
     
    double kc;
    double sj;
    double dj;
};
bool cmp(yb a,yb b){
     
    return a.dj>b.dj;
}
int main(){
     
    int n,d;
    double sum=0;
    cin>>n>>d;
    yb nyb[n];
    for(int i=0;i<n;i++)
        cin>>nyb[i].kc;
    for(int i=0;i<n;i++)
        cin>>nyb[i].sj;
    for(int i=0;i<n;i++)
        nyb[i].dj=nyb[i].sj/nyb[i].kc;
    sort(nyb,nyb+n,cmp);
    // for(int i=0;i
    //     cout<
    for(int i=0;i<n;i++)
    {
     
        if(d>0)
        {
     
            if(d-nyb[i].kc>=0)
            {
     
                sum=sum+nyb[i].sj;
                d=d-nyb[i].kc;
            }
            else 
            {
     
                sum=sum+nyb[i].dj*d;
                d=0;
            } 
        }
        else 
            break;
    }
    printf("%.2f",sum);
    return 0;
}

你可能感兴趣的