PTA水题140题

/ 0评 / 5

PTA标题:中M2021秋C、Java入门练习第I段——变量、表达式、分支、循环
PTA链接:https://pintia.cn/problem-sets/1436984601076768768
PTA邀请码:9418336228c8c09f

开始时间
2021/09/13 00:00:00
结束时间
2021/12/31 23:59:00

gtiee仓库:https://gitee.com/lingyun67/pta-water-question-140/

本人的编译器使用的是Visual Studio 2019,因此若有需要,当遇到scanf_s函数时,应该将其改成scanf。

7-1 重要的话说三遍

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

你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。

注意每遍占一行,除了每行的回车不能有任何多余字符。

个人答案:

#include <stdio.h>

main(void)
{
	printf("I'm gonna WIN!\n");
	printf("I'm gonna WIN!\n");
	printf("I'm gonna WIN!\n");

	return 0;
}

7-2 I Love GPLT

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

你只需要把这句很重要的话 —— I Love GPLT ——竖着输出就可以了。

所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。

个人答案:

#include <stdio.h>

main(void)
{
	printf("I\n \nL\no\nv\ne\n \nG\nP\nL\nT\n");

	return 0;
}

7-3 输出带框文字

本题要求编写程序,输出指定的带框文字。

输入格式:

本题无输入

输出格式:

按照下列格式输出带框文字。

************
  Welcome
************

个人答案:

#include <stdio.h>

main(void)
{
	printf("************\n");
	printf("  Welcome\n");
	printf("************\n");

	return 0;
}

7-4 输出菱形图案

本题要求编写程序,输出指定的由“A”组成的菱形图案。

输入格式:

本题无输入

输出格式:

按照下列格式输出由“A”组成的菱形图案。

  A
A   A
  A

个人答案:

#include <stdio.h>

main(void)
{
	printf("  A\n");
	printf("A   A\n");
	printf("  A\n");

	return 0;
}

7-5 输出倒三角图案 

本题要求编写程序,输出指定的由“*”组成的倒三角图案。

输入格式:

本题目没有输入。

输出格式:

按照下列格式输出由“*”组成的倒三角图案。

* * * *
 * * *
  * *
   *

个人答案:

#include <stdio.h>

main(void)
{
	printf("* * * *\n");
	printf(" * * *\n  * *\n   *\n");
	
	return 0;
}

7-6 厘米换算英尺英寸

如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:

输入在一行中给出1个正整数,单位是厘米。

输出格式:

在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:

170
结尾无空行

输出样例:

5 6
结尾无空行

个人答案:

#include <stdio.h>

int main(void)
{
	//输入原始数据并简单处理
	float shuru = 0;
	scanf("%f", &shuru);
	shuru *= 0.01;
	//换算英尺
	float huansuan = shuru / 0.3048;
	int foot = (int)huansuan;//截断
	//换算英寸
	int inch = (int)((huansuan - foot)*12);
	//输出
	printf("%d %d", foot, inch);

	return 0;
}

7-7 计算摄氏温度

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

输入格式:

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

输出格式:

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

输入样例:

150
结尾无空行

输出样例:

Celsius = 65
结尾无空行

个人答案:

#include <stdio.h>

main(void)
{
	int F;
	scanf("%d", &F);
	int C = F - 32;
	C *= 5;
	C /= 9;
	printf("Celsius = %d", C);

	return 0;
}

7-8 是不是太胖了

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)

输入格式:

输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。

输出格式:

在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。

输入样例:

169
结尾无空行

输出样例:

124.2
结尾无空行

个人答案:

#include <stdio.h>

main(void)
{
	int shengao/*身高*/;
	scanf("%d", &shengao);

	float tizhong/*体重-斤*/ = (shengao - 100) * 0.9 * 2;

	printf("%.1f", tizhong);

	return 0;
}

7-9 求整数均值

本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。

输入格式:

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

输出格式:

在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。

输入样例:

1 2 3 4

输出样例:

Sum = 10; Average = 2.5

个人答案:

#include <stdio.h>

main(void)
{
	int a = 0, b = 0, c = 0, d = 0;
	scanf("%d %d %d %d", &a, &b, &c, &d);

	int sum = a + b + c + d;
	float age = sum / 4.0;

	printf("Sum = %d; Average = %.1f", sum, age);

	return 0;
}

7-10 算术入门之加减乘除

对于输入的两个整数,按照要求输出其和差积商。

输入格式:

在一行内输入两个不超过100的非负整数a和b,中间以一个空格间隔,且保证b不为0。

输出格式:

共四行,格式是:

[a] + [b] = [a+b]
[a] - [b] = [a-b]
[a] * [b] = [a*b]
[a] / [b] = [a/b]

其中,带有方括号的内容(如[a][b][a+b]等)表示相应整数或运算结果的值,在输出时要用实际的值代替。

并且:如果a能够被b整除,那么a/b应输出为整数格式,否则a/b输出为带两位小数的格式。

提示:注意表达式中的空格。

输入样例1:

6 3

输出样例1:

6 + 3 = 9
6 - 3 = 3
6 * 3 = 18
6 / 3 = 2

输入样例2:

8 6

输出样例2:

8 + 6 = 14
8 - 6 = 2
8 * 6 = 48
8 / 6 = 1.33

个人答案:

#include <stdio.h>

main(void)
{
	/*
	float shu = 2.2;
	int shu2 = 2.2 / 1;
	if (shu == shu2)
		printf("shu为整数");
	printf("%.2f", shu);
	*/
	float a, b;
	scanf("%f %f", &a, &b);

	printf("%.f + %.f = %.f\n", a, b, a + b);
	printf("%.f - %.f = %.f\n", a, b, a - b);
	printf("%.f * %.f = %.f\n", a, b, a * b);

	float achub/*a除b*/ = a / b;
	int chu/*截断小数*/ = a / b;
	if (achub == chu)//可被整除
		printf("%.f / %.f = %.f\n", a, b, a / b);
	else if (achub != chu)//不可整除
		printf("%.f / %.f = %.2f\n", a, b, a / b);
	else
		printf("未知错误\n");
		
	return 0;
}

7-11 计算平均分

已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。

输入格式:

本题无输入

输出格式:

按照下列格式输出结果:

math = 87, eng = 72, comp = 93, average = 计算所得的平均成绩

个人答案:

#include <stdio.h>

int main(void)
{
	int math = 87, eng = 72, comp = 93;
	printf("math = %d, eng = %d, comp = %d, ", math, eng, comp);
	
	int avg = 0;
	avg = (math + eng + comp) / 3;
	printf("average = %d", avg);


	return 0;
}

7-12 日期格式化

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:

输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:

在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:

03-15-2017

输出样例:

2017-03-15

个人答案:

#include <stdio.h>

int main(void)
{
	int yyyy = 0, mm = 0, dd = 0;
	scanf("%d-", &mm);
	scanf("%d-", &dd);
	scanf("%d", &yyyy);

	printf("%d-%02d-%02d", yyyy, mm, dd);

	return 0;
}

7-13 后天

如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。

输入格式:

输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。

输出格式:

在一行中输出D天的后天是星期几。

输入样例:

3

输出样例:

5

个人答案:

#include <stdio.h>

int main(void)
{
	int day;
	scanf("%d", &day);
	day += 2;
	if (day > 7) {
		day = day % 7;
	}

	printf("%d", day);

	return 0;
}

7-14 然后是几点

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

输入格式:

输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:

输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310

鸣谢燕山大学穆运峰老师、用户任钰补充数据!

个人答案:

#include <stdio.h>

int main(void)
{
	int time, add;
	scanf("%d %d", &time, &add);
	int hh = time / 100;
	int mm = time % 100;
	mm = mm + add;

	if (mm > 59) { //分钟大于59进位
		hh += mm / 60;
		mm %= 60;
	}
	else if (mm < 0) { //分钟为负数扣小时
		hh -= 1;
		hh += mm / 60;
		mm %= 60;
		mm = mm + 60;	
	}
	
	printf("%d%02d", hh, mm);

	return 0;
}

7-15 BCD解密

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:

输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:

输出对应的十进制数。

输入样例:

18

输出样例:

12

个人答案:

啥啊?
BCD是啥啊?
我查了也查不明白,先做下一个吧

7-16 计算符号函数的值

对于任一整数n,符号函数sign(n)的定义如下:

请编写程序计算该函数对任一输入整数的值。

输入格式:

输入在一行中给出整数n。

输出格式:

在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。

输入样例1:

10

输出样例1:

sign(10) = 1

输入样例2:

0

输出样例2:

sign(0) = 0

输入样例3:

-98

输出样例3:

sign(-98) = -1

个人思路:

写的那么多还以为很难,感觉直接if-else if-else就行
再加一个单一出口吧,用switch-case。
话说这个我还没用过

哦哦,直接输出就行

个人答案:

#include <stdio.h>

int main(void)
{
	int x = 0, y = 0;
	scanf("%d", &x);
	if (x < 0) {
		y = -1;
	}
	else if (x > 0) {
		y = 1;
	}
	else {
		y = 0;
	}

	printf("sign(%d) = %d", x, y);


	return 0;
}

7-17 成绩转换

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

输入格式:

输入在一行中给出一个整数的百分制成绩。

输出格式:

在一行中输出对应的五分制成绩。

输入样例:

90

输出样例:

A

个人答案:

#include <stdio.h>

int main(void)
{
	int n = 0;
	char y;
	scanf("%d", &n);
	if (n >= 90) {
		y = 'A';
	}
	else if (n >= 80) {
		y = 'B';
	}
	else if (n >= 70) {
		y = 'C';
	}
	else if (n >= 60) {
		y = 'D';
	}
	else if (n < 60) {
		y = 'E';
	}
	else {
		printf("未知错误");
	}

	printf("%c", y);

-    
	return 0;
}

7-18 出租车计价

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

输入格式:

输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:

2.6 2

输出样例1:

10

输入样例2:

5.1 4

输出样例2:

14

输入样例3:

12.5 9

输出样例3:

34

个人思路:

判断行车里程与 3 13 的大小关系
我理解的是
行车收费:
<=3km:10¥
3km<=x<=13km:2¥/km 加上上一条
>=13km:3¥/km 加上上两条
等待时间:不判断直接除五截断 得到等待收费

个人答案:

下面这个是第一个版本,在第三个例子:"sample 3 超过10公里,等待,入 "中错误。

#include <stdio.h>

int main(void)
{
	float chang = 0.0;
	int time = 0;
	scanf("%f %d", &chang, &time);

	int timepay = time / 5 * 2;
	float changpay = 0;

	if (chang <= 3) {
		changpay += 10;
	}
	else if (chang <= 13) {
		changpay += 10;
		changpay += (chang - 3) * 2;
	}
	else {
		changpay += 10;
		changpay += (chang - 3) * 2;
		changpay += (chang - 13) * 3;
	}
	
	float add = changpay + timepay;
	int sishewuru = (int)(add * 10) / 1 % 10; //pay*10/1后%10取个位 最终得到小数点第一位 后续实现四舍五入
	int pay = (int)add;

	if (sishewuru >= 5) {
		pay += 1;
	}

	printf("%d", pay);

	return 0;
}

经测试:

#include <stdio.h>

int main(void)
{
	float chang = 0.0;
	int time = 0;
	scanf_s("%f %d", &chang, &time);

	int timepay = time / 5 * 2;
	float changpay = 0;

	if (chang <= 3) {
		changpay += 10;
		printf("in one if changpay = %f\n", changpay);
	}
	else if (chang <= 10) {
		changpay += 10;
		changpay += (chang - 3) * 2;
		printf("in two if changpay = %f\n", changpay);
	}
	else {
		changpay += 10;
		changpay += (chang - 3) * 2;
		changpay += (chang - 13) * 3;
		printf("in three if changpay = %f\n", changpay);
	}
	float add = changpay + timepay;
	printf("changpay + timepay = %f\n", changpay + timepay);

	int sishewuru = (int)(add * 10) % 10; //pay*10/1后%10取个位 最终得到小数点第一位 后续实现四舍五入
	printf("(int)(add * 10) %% 10 = %d\n", (int)(add * 10) % 10);

	int pay = (int)add;
	printf("(int)add = %d\n", (int)add);

	if (sishewuru >= 5) {
		pay += 1;
	}

	printf("pay = %d\n", pay);
	printf("%d", pay);

	return 0;
}

代码无问题 题目理解问题

在其他解答中找到这样的解法:

“超起步里程后10公里内,每公里2元;”十公里指的是总共10公里,我计算的是3+10公里

最后发现有多出错误 个人正确答案为:

#include <stdio.h>

int main(void)
{
	float km = 0.0;
	int time = 0;
	scanf_s("%f %d", &km, &time);

	int timepay = time / 5 * 2;
	float kmpay = 0;

	if (km <= 3) {
		kmpay += 10;
		//printf("in one if kmpay = %f\n", kmpay);
	}
	else if (km <= 10) {
		kmpay += 10;
		kmpay += (km - 3) * 2;
		//printf("in two if kmpay = %f\n", kmpay);
	}
	else {
		kmpay += 10;
		kmpay += 7 * 2;
		kmpay += (km - 10) * 3;
		//printf("in three if kmpay = %f\n", kmpay);
	}
	float add = kmpay + timepay;
	//printf("kmpay + timepay = %f\n", kmpay + timepay);

	int sishewuru = (int)(add * 10) % 10; //pay*10/1后%10取个位 最终得到小数点第一位 后续实现四舍五入
	//printf("(int)(add * 10) %% 10 = %d\n", (int)(add * 10) % 10);

	int pay = (int)add;
	//printf("(int)add = %d\n", (int)add);

	if (sishewuru >= 5) {
		pay += 1;
	}

	//printf("pay = %d\n", pay);
	printf("%d", pay);

	return 0;
}

7-19 计算天数

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62

鸣谢湖北汽车工业学院袁科老师、用户潘明智补充数据!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注