PTA团体程序设计天梯赛-练习集(合集)

目录

前言

L1-001 Hello World

思路

L1-002 打印沙漏

思路

L1-003 个位数统计

思路

L1-004 计算摄氏温度

思路

L1-005 考试座位号

思路

L1-006 连续因子

思路

L1-007 念数字

思路

L1-008 求整数段和

思路

L1-009 N个数求和

思路

L1-010 比较大小

思路

L1-011 A-B

思路

L1-012 计算指数

思路

L1-013 计算阶乘和

思路

L1-014 简单题

思路

L1-015 跟奥巴马一起画方块

思路

L1-016 查验身份证

思路

L1-017 到底有多二

思路

L1-018 大笨钟

思路

L1-019 谁先倒

思路


前言

之前写过PTA的几篇题解,但是不够全面,这次准备把pta习题集系统的写一遍,每道题都附上思路与解法。

视频讲解见b站~c语言期末编程题【PTA刷题】_哔哩哔哩_bilibili

L1-001 Hello World

这道超级简单的题目没有任何输入。

你只需要在一行中输出著名短句“Hello World!”就可以了。

输入样例:

输出样例:

Hello World!

思路

末尾不要有空格,PTA对于格式检查非常的严格。

#include <stdio.h>

int main() {
	printf("Hello World!") ;
	return 0;
}

L1-002 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

思路

需要先通过推断得到f(3)=f(2)+4n-2 =17 即最大的完整的沙漏需要多少字符。

知道了这个后续就是正常打印了。

#include <stdio.h>

int main() {
	/*
	1 * 1
	*****
	2 *** 7
	   *
	  ***
	  *****
	3 17
	f(3)=f(2)+4n-2 =17
	
	*/
	
	int p[100]={1};
	int i,j,k,n;
	char c;
	for(i=1;p[i-1]<1000;i++){
		p[i]=p[i-1]+4*(i+1)-2;
	}
	scanf("%d %c",&n,&c);
	for(i=0;p[i]<n;i++);
	
	if(i==0)k=1;
	else k=i;
	
	for(i=0;i<k;i++){
		for(j=0;j<i;j++){
			printf(" ");
		}
		for(j=0;j<2*(k-i)-1;j++){
			printf("%c",c);
		}
		printf("\n");
	}
	for(i=1;i<k;i++){
		for(j=0;j<k-i-1;j++){
			printf(" ");
		}
		for(j=0;j<2*(i+1)-1;j++){
			printf("%c",c);
		}
		printf("\n");
	}
	printf("%d",n-p[i-1]);
	
	return 0;
}

L1-003 个位数统计

给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:

每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:

对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:

100311

输出样例:

0:2
1:3
3:1

思路

开辟一个数组 将数字映射到数组内即可。注意使用字符串接收,这样会方便很多。

#include <stdio.h>

int main() {
	
	int i;
	char c[1007];
	int p[10]={0};
	scanf("%s",c);
	for(i=0;c[i]!='\0';i++){
		p[c[i]-'0']++;
	}
	for(i=0;i<10;i++){
		if(p[i]!=0){
			printf("%d:%d\n",i,p[i]);
		}
	}
	
	return 0;
}

L1-004 计算摄氏温度

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。

输入格式:

输入在一行中给出一个华氏温度。

输出格式:

在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。

输入样例:

150

输出样例:

Celsius = 65

思路

没神马好注意的,这里不涉及小数,直接上公式打印即可。

#include <stdio.h>

int main() {
	int n;
	scanf("%d",&n);
	printf("Celsius = %d",5*(n-32)/9); 
	
	return 0;
}

L1-005 考试座位号

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:

输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样例:

4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4

输出样例:

3310120150912002 2
3310120150912119 1

思路

看起来很复杂,但是其实很简单,定义一个结构体用来存放每一行的数据,这样三个号之间就关联起来了,最后写一个查询函数寻找即可。

#include <stdio.h>

struct pp{
	char s[20];
	int a,b;
};

struct pp p[1007];
int n,m;

void find(int k){
	int i;
	for(i=0;i<n;i++){
		if(p[i].a==k){
			printf("%s %d\n",p[i].s,p[i].b);
			break;
		}
	}
}

int main() {
	scanf("%d",&n);
	int i;
	for(i=0;i<n;i++){
		scanf("%s %d %d",p[i].s,&p[i].a,&p[i].b);
	}
	scanf("%d",&m);
	int k;
	while(m--){
		scanf("%d",&k);
		find(k);
	}

	return 0;
}

L1-006 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<231)。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7

思路

不考虑时间复杂度,写起来也很简单,双重循环内循环查找因子是否连续,出内循环后对比哪个更长,标记起始位和长度即可。

#include <stdio.h>
#include <math.h>

int main() {
	int i,j;
	int n,mi=0,mn=0;
	scanf("%d",&n);
	for(i=2; i<=sqrt(n); i++) {
		int t=n;
		for(j=i; j<=t; j++) {
			if(t%j!=0)break;
			else t/=j;
		}
		if(j-i>mn) {
			mi=i;
			mn=j-i;
		}
	}
	if(mn==0) {
		printf("1\n%d",n);
	} else {
		printf("%d\n",mn);
		for(i=0; i<mn-1; i++) {
			printf("%d*",mi);
			mi++;
		}
		printf("%d",mi);
	}


	return 0;
}

L1-007 念数字

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

输入格式:

输入在一行中给出一个整数,如:1234

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si

输入样例:

-600

输出样例:

fu liu ling ling

思路

还好,没有涉及百千这样的读法,所以写起来也很简单,定义一张拼音表,注意下标和数字拼音对应即可。

#include <stdio.h>
#include <math.h>

int main() {
	char p[17][10]= {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	char s[20];
	scanf("%s",s);
	int i=0;//strlen() string.h
	for(i=0;s[i]!='\0';i++){
		if(s[i]=='-'){
			printf("fu ");
		}else{
			printf("%s",p[s[i]-'0']);
			if(s[i+1]!='\0'){
				printf(" ");
			}
		}
	}

	return 0;
}

L1-008 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式:

首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X

输入样例:

-3 8

输出样例:

   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30

思路

本来很简单的一道题,但是因为五位一对齐搞的有点麻烦。

%5d 在5位范围内 不足前面补零(超过五位不作处理 和%d就一样了)

#include <stdio.h>

int main() {
	int n,m,k=0,z=0;
	int i;
	scanf("%d %d",&n,&m);
	for(i=n;i<=m;i++){
		printf("%5d",i);
		k++;
		z+=i;
		if(k%5==0){
			printf("\n");
		}
	}
	if(k%5!=0){
		printf("\n");
	}
	printf("Sum = %d",z);

	return 0;
}

L1-009 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

思路

居然要通分 这么一想脑子都大了,首先不要想多个分数通分,我们只看两个分数。

如果是 1/6 1/9这样的分数 先分母相乘 然后分子互相乘 在变成一个分子 再分子分母约分。

这么一想 难点只有分子分母约分了,分子分母约分 也就是都除去他们两个的最大公因数,即gcd算法。这里给出一个gcd模板 代码很少 直接用即可。

#include <stdio.h>

#define ll long long //2^63-1  2^31-1 

//gcd(a,b) = gcd(b,a mod b) 
ll gcd(ll a,ll b) {//最大公约数  4 8 4 1/2 
	return b==0?a:gcd(b,a%b);
}

int main() {

	ll a,b,c,d,n;
	ll i;
	scanf("%lld",&n);
	scanf("%lld/%lld",&a,&b);//2/5 4/15  
	n-=1;
	while(n--) {
		scanf("%lld/%lld",&c,&d);
		int lcp = b * d;
		a = a * lcp / b + c * lcp / d;//通分后分子和
		b = lcp;//分母
		int t0 = gcd(a,b);
		if(t0 != 0) { //分子分母化简
			a = a / t0;
			b = b / t0;
		}
	}
	
	if(a && a/b == 0)/// 整数部分为0 且 a不为 0
		printf("%lld/%lld\n",a%b,b);
	else if(a%b == 0)/// 可以被整除 
		printf("%lld\n",a/b);
	else
		printf("%lld %lld/%lld\n",a/b,a%b,b);

	return 0;
}

L1-010 比较大小

本题要求将输入的任意3个整数从小到大输出。

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例:

4 2 8

输出样例:

2->4->8

思路

直接上系统排序,qsort这么好用,代码也算是一个qsort的模板了,a-b是从小到大(如果a-b是负数 a会在前,是正数 a大 a就会放在后面)倒过来b-a即是从大到小

#include <stdio.h>
#include <stdlib.h>

int gg(const void *a ,const void *b) {
	return *(int *)a-*(int *)b;
}

int main() {

	int i,n=3;
	int p[10]= {0};
	for(i=0; i<n; i++) {
		scanf("%d",&p[i]);
	}
	qsort(p,n,sizeof(p[0]),gg);
	for(i=0; i<n; i++) {
		printf("%d",p[i]);
		if(i!=n-1){
			printf("->");
		}
	}
	return 0;
}

L1-011 A-B

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:

输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出A−B的结果字符串。

输入样例:

I love GPLT!  It's a fun game!
aeiou

输出样例:

I lv GPLT!  It's  fn gm!

思路

遍历A字符串 每个字符都在B字符串中查询 注意c语言里面%s遇到空格会停止,这里需要使用gets函数

#include <stdio.h>

char s1[10007];
char s2[10007];

int find(char c){
	int i;
	for(i=0;s2[i]!='\0';i++){
		if(s2[i]==c){
			return 1;
		}
	}
	return 0;
}

int main() {
	gets(s1);
	gets(s2);
	int i;
	for(i=0;s1[i]!='\0';i++){
		if(find(s1[i])==0){
			printf("%c",s1[i]);
		}
	}
	
	return 0;
}

L1-012 计算指数

真的没骗你,这道才是简单题 —— 对任意给定的不超过 10 的正整数 n,要求你输出 2n。不难吧?

输入格式:

输入在一行中给出一个不超过 10 的正整数 n。

输出格式:

在一行中按照格式 2^n = 计算结果 输出 2n 的值。

输入样例:

5

输出样例:

2^5 = 32

思路

这个有好几种方法哦 不管是2乘n遍 还是使用math.h里的pow函数都可以,但是我最喜欢的还是二进制,这个2的次幂和二进制太搭了有没有?

如果你知道二进制怎么转是十进制的 就理解了1<<n的作用,在二进制里 每一位都代表着2的次幂,

以100为例  从最低位开始数 0 1 2 所以100的十进制就是 1*2^2+0*2^1+0*2^0 = 4

每一位都是二的次幂 我们把最低位的1向左移几位 得到的十进制的值就是2的几次幂了。

1<<2 可以看出0001变成了0100 左移两位 0100 = 2^2

(n<10 最后结果小于1024 不怕int溢出)

#include <stdio.h>

int main() {
	
	int n;
	scanf("%d",&n);
	printf("2^%d = %d",n,1<<n);

	return 0;
}

L1-013 计算阶乘和

对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。

输入格式:

输入在一行中给出一个不超过10的正整数N。

输出格式:

在一行中输出S的值。

输入样例:

3

输出样例:

9

思路

定义一个阶乘函数 循环求阶乘。

(用递归可能更简洁 但是对系统栈的开销太大了,不如写循环做)

#include <stdio.h>

int ff(int n){
	int i=0,z=1;
	for(i=1;i<=n;i++){
		z*=i;
	}
	return z;
}

int main() {
	
	int i,n,z=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		z+=ff(i);
	}
	printf("%d",z);
	
	return 0;
}

L1-014 简单题

这次真的没骗你 —— 这道超级简单的题目没有任何输入。

你只需要在一行中输出事实:This is a simple problem. 就可以了。

输入样例:

输出样例:

This is a simple problem.

思路

和第一题一样,但是我们换个写法。定义一个字符串常量 使用指针指向它 打印指针值,可以试试s字符串可不可以s[i]来访问修改哦

#include <stdio.h>

int main() {
	char *s="This is a simple problem.";
	puts(s);
	
	return 0;
}

L1-015 跟奥巴马一起画方块

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入格式:

输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。

输出格式:

输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。

输入样例:

10 a

输出样例:

aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa

思路

好抽象的一道题 这道题主要要注意四舍五入问题 如果是奇数/2 最后一定是***.5 会进位 所以判断奇偶即可

#include <stdio.h>

int main() {
	int i,j;
	int n,m;
	char c;
	scanf("%d %c",&n,&c);
    // 四舍五入设置
	if(n&1)m=n/2+1;
	else m=n/2;
    
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			putchar(c);//puts()
		}
		printf("\n");
	}

	return 0;
}

L1-016 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:

输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:

按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed

输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X

输入样例2:

2
320124198808240056
110108196711301862

输出样例2:

All passed

思路

比较有意思的题目 设置两个数组分别使用下标判断即可

#include <stdio.h>

int main() {
	int i,j;
	int n,vis=-1;
	int p[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	char m[20]="10X98765432";
	scanf("%d",&n);
	while(n--){
		int z=0;
		char s[20];
		scanf("%s",s);
		for(i=0;i<17;i++){
			z+=(s[i]-'0')*p[i];
			z%=11;
		}
		if(s[17]!=m[z]){
			vis++;
			printf("%s\n",s);
		}
	}
	if(vis==-1){
		printf("All passed");
	}

	return 0;
}

L1-017 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。

输入格式:

输入第一行给出一个不超过50位的整数N

输出格式:

在一行中输出N犯二的程度,保留小数点后两位。

输入样例:

-13142223336

输出样例:

81.82%

思路

这一道题需要注意最后%的打印,是用%%来打印的

#include <stdio.h>

int main() {
	int i=0,k=0;
	char s[100];
	scanf("%s",s);
	for(i=0;s[i]!='\0';i++){
		if(s[i]=='2')k++;
	}
	double f=1;
	if(s[0]=='-'){
		f+=0.5;
		if((s[i-1]-'0')%2==0){
			f*=2;
		}
		i--;
	}else{
		if((s[i-1]-'0')%2==0){
			f*=2;
		}
	}
	f=(double)k/i*f*100;
	printf("%.2lf%%",f);

	return 0;
}

L1-018 大笨钟

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。

下面就请你写个程序,根据当前时间替大笨钟敲钟。

输入格式:

输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

输出格式:

根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:

Only hh:mm.  Too early to Dang.

其中hh:mm是输入的时间。

输入样例1:

19:05

输出样例1:

DangDangDangDangDangDangDangDang

输入样例2:

07:05

输出样例2:

Only 07:05.  Too early to Dang.

思路

之前介绍过%5d 是使用空格在前补齐 这里使用%02d 就是使用0在前补齐

#include <stdio.h>
int main() {
	
	char *s="Dang";
	int h,m;//19:23
	scanf("%d:%d",&h,&m);
	
	if(h<=12) {
		printf("Only %02d:%02d.  Too early to Dang.",h,m);
	}else{
		for(int i=0;i<(h-12);i++){
			printf("%s",s);
		}
		if(m!=0){
			printf("%s",s);
		}
	}

	return 0;
}

L1-019 谁先倒

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

输入格式:

输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中是喊出的数字,是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:

在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。

输入样例:

1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16

输出样例:

A
1

思路

模拟一下

#include <stdio.h>
  
int main() {  
    // 甲和乙的酒量  
    int aj, bj;  
    // 甲和乙已经喝的酒量  
    int aj1 = 0, bj1 = 0;  
    // 还需进行的划拳轮数  
    int n;  
    // 甲喊出的数字、甲划出的数字、乙喊出的数字、乙划出的数字  
    int ah, aha, bh, bha;  
  
    // 输入甲和乙的酒量  
    scanf("%d %d",&aj,&bj);
    // 输入还需进行的划拳轮数  
    scanf("%d",&n);
  
    // 循环处理每一轮划拳  
    while (n--) {  
        // 输入每轮划拳的四个数字 
        scanf("%d %d %d %d",&ah,&aha,&bh,&bha);
        // 初始化变量,记录这一轮是否有人输  
        int a1 = -1, b1 = -1;  
  
        // 判断甲是否输  
        if (ah + bh == aha) {  
            a1 = 0;  
        }  
  
        // 判断乙是否输  
        if (ah + bh == bha) {  
            b1 = 0;  
        }  
  
        // 根据输赢情况更新酒量和已喝酒数量  
        if (a1 == 0 && b1 != 0) {  
            // 甲输,甲酒量减一,甲已喝酒数量加一  
            aj--;  
            aj1++;  
        }  
  
        if (a1 != 0 && b1 == 0) {  
            // 乙输,乙酒量减一,乙已喝酒数量加一  
            bj--;  
            bj1++;  
        }  
  
        // 如果有人倒下,则终止循环  
        if (aj < 0 || bj < 0) break;  
    }  
  
    // 输出先倒下的人及其对手已喝的酒数量  
    if (aj < 0) {  
        printf("A\n%d",bj1);
    } else {  
        printf("B\n%d",aj1);
    }  
  
    return 0;  
}

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值