20200609整理
pat乙真题
锤子剪刀布
链接:https://www.nowcoder.com/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,结果多输出一次等式导致判定失败,还是要想清楚再写。