admin管理员组

文章数量:1621658

20200609整理
pat乙真题


锤子剪刀布
链接:https://www.nowcoder/questionTerminal/79db907555c24b15a9c73f7f7d0e2471
来源:牛客网

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入描述:
输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代
表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。

输出描述:
输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯
一,则输出按字母序最小的解。
示例1
输入
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出
5 3 2
2 3 5
B B


#include<stdio.h>
typedef struct game{
    int win;
    int draw;
    int lose;
    int Jwin;
    int Cwin;
    int Bwin;
}game;
char max(game a);
int main(void){
    game a={0};
    game b={0};
    int n,i;
    char ges1,ges2;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        getchar();
        scanf("%c %c",&ges1,&ges2);
        if(ges1=='C'&&ges2=='J'){
            a.win++;
            a.Cwin++;
            b.lose++;
        }else if(ges1=='J'&&ges2=='B'){
            a.win++;
            a.Jwin++;
            b.lose++;
        }else if(ges1=='B'&&ges2=='C'){
            a.win++;
            a.Bwin++;
            b.lose++;
        }else if(ges2=='C'&&ges1=='J'){
            b.win++;
            b.Cwin++;
            a.lose++;
        }else if(ges2=='J'&&ges1=='B'){
            b.win++;
            b.Jwin++;
            a.lose++;
        }else if(ges2=='B'&&ges1=='C'){
            b.win++;
            b.Bwin++;
            a.lose++;
        }else{
            a.draw++;
            b.draw++;
        }
    }
    printf("%d %d %d\n",a.win,a.draw,a.lose);
    printf("%d %d %d\n",b.win,b.draw,b.lose);
    printf("%c %c\n",max(a),max(b));
}
char max(game a){
    char w='B';
    if(a.Cwin>a.Bwin){
        w='C';
        if(a.Jwin>a.Cwin)
            w='J';
    }
    return w;
}

小结
强硬做法.。
要注意的是在读入每组字符型数据时要先用getchar吸收一个回车,否则会报错。

数字黑洞
现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入描述:
输入给出一个(0, 10000)区间内的正整数N。

输出描述:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格
式输出。

输入例子:
6767

输出例子:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174



#include<stdio.h>
void cal(int n,int*num1,int*num2);
int main(void){
    int N;
    scanf("%d",&N);
    int n1,n2;
     
    cal(N,&n1,&n2);
    if(n1!=n2){
        while((n2-n1)!=6174){
            printf("%04d - %04d = %04d\n",n2,n1,n2-n1);
            N=n2-n1;
            cal(N,&n1,&n2);
        }
        printf("%04d - %04d = %04d\n",n2,n1,n2-n1);
    }else{
        printf("%d-%d=0000\n");
    }
}
void cal(int n,int*num1,int*num2){
    int a=n/1000;
    int d=n%10;
    int c=(n/10)%10;
    int b=(n/100)%10;
    int t;
    if(a>b){
        t=a;a=b;b=t;
    }
    if(a>c){
        t=a;a=c;c=t;
    }
    if(a>d){
        t=a;a=d;d=t;
    }
    if(b>c){
        t=b;b=c;c=t;
    }
    if(b>d){
        t=b;b=d;d=t;
    }
    if(c>d){
        t=c;c=d;d=t;
    }
    *num1=a*1000+b*100+c*10+d;
    *num2=d*1000+c*100+b*10+a;
}

小结
还是笨办法。
求递增递减序列如果用快排可能好一点。
另外第一次做的时候用了do while,结果多输出一次等式导致判定失败,还是要想清楚再写。

本文标签: