PTA基础题练习2

1. 逆序的三位数

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:

每个测试是一个3位的正整数。

输出格式:

输出按位逆序的数。

输入样例:

123

输出样例:

321
num = input().strip()
num2 = int(num[::-1])
print(num2)

2. 12-24小时制

编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。

输入格式:

输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。
输出格式:

在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM

输入样例:

21:11

输出样例:

9:11 PM
str1 = input().strip().split(':')
hour = int(str1[0])
minutes = int(str1[1])
if hour < 12:
    flag = 'AM'
else:
    flag = 'PM'
if hour > 12:
    hour -= 12
print(f'{hour}:{minutes} {flag}')

3. 超速检测

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。

输入格式:

输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。

输出格式:

在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK

输入样例1:

40

输出样例1:

Speed: 40 - OK

输入样例2:

75

输出样例2:

Speed: 75 - Speeding
#include <stdio.h>

int main()
{
    int speed;
    scanf("%d", &speed);
    if (speed > 60)
        printf("Speed: %d - Speeding\n", speed);
    else
        printf("Speed: %d - OK\n", speed);
    return 0;
}

4. 用天平找球

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式:

输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式:

在一行中输出唯一的那个不一样的球。

输入样例:

1 1 2

输出样例:

C
#include <stdio.h>

int main()
{
    int a, b, c;
    scanf("%d %d %d",&a, &b, &c);
    if(a != b && a != c)
        printf("A\n");
    if(b != a && b != c)
        printf("B\n");
    if(c != a && c != b)
        printf("C\n");
    return 0;
}

5. 计算工资

某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。

输入格式:

输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。

输出格式:

在一行输出该员工的周薪,精确到小数点后2位。

输入样例1:

5 40

输出样例1:

2000.00

输入样例2:

3 50

输出样例2:

1650.00
#include <stdio.h>

int main()
{
    int work_year, work_hours;
    float salary;
    scanf("%d %d", &work_year, &work_hours);
    if (work_year < 5)
    {
        if (work_hours <= 40)
            salary = 30 * work_hours;
        else
            salary = 30 * 40 + 30 * 1.5 * (work_hours - 40);
    }else{
        if (work_hours <= 40)
            salary = 50 * work_hours;
        else
            salary = 50 * 40 + 50 * 1.5 * (work_hours - 40);
    }
    printf("%.2f", salary);
    return 0;
}

6. 计算水费

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:

x不超过15吨时,
y=4x/3 y=4x/3 y=4x/3
超过后,
y=2.5x−17.5 y=2.5x-17.5 y=2.5x17.5
请编写程序实现水费的计算。

输入格式:

输入在一行中给出非负实数x

输出格式:

在一行输出应交的水费,精确到小数点后2位。

输入样例1:

12

输出样例1:

16.00

输入样例2:

16

输出样例2:

22.50
#include <stdio.h>

int main()
{
    float x, y;
    scanf("%f", &x);
    if (x <= 15)
        y = x * 4 / 3;
    else
        y = 2.5 * x - 17.5;
    printf("%.2f", y);
    return 0;
}

7. 日K蜡烛图

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。

如果Close<Open,表示为“BW-Solid”(即“实心蓝白蜡烛”);
如果Close>Open,表示为“R-Hollow”(即“空心红蜡烛”);
如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。
如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。
根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。

输入格式:

输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。

输出格式:

在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow

输入样例1:

5.110 5.250 5.100 5.105

输出样例1:

BW-Solid with Lower Shadow and Upper Shadow

输入样例2:

5.110 5.110 5.110 5.110

输出样例2:

R-Cross

输入样例3:

5.110 5.125 5.112 5.126

输出样例3:

R-Hollow
numbers = [float(i) for i in input().strip().split(' ')]
open, high, low, close = numbers
if close < open:
    ans = "BW-Solid"
if close > open:
    ans = "R-Hollow"
if open == close:
    ans = "R-Cross"
line_type = []
if low < open and low < close:
    line_type.append("Lower Shadow")
if high > open and high > close:
    line_type.append("Upper Shadow")
if len(line_type) == 0:
    print(ans)
elif len(line_type) == 1:
    print(f"{ans} with {line_type[0]}")
else:
    print(f"{ans} with {line_type[0]} and {line_type[1]}")

8. 求符合给定条件的整数集

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:

输入在一行中给出A。

输出格式:

输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:

2

** 输出样例:**

234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
#include <stdio.h>

int main()
{
    int a;
    scanf("%d", &a);
    int i, j, k, count = 0;
    for(i = a; i <= a+3; i++)
    {
        for(j = a; j<= a+3;j++)
        {
            for(k = a; k <= a+3; k++)
            {
                if(i!=j && i!=k && j != k)
                {
                    count++;
                    if(count % 6 != 0)
                    {
                        printf("%d ", i*100+j*10+k);
                    }
                    else
                        printf("%d\n", i*100+j*10+k);
                }
            }
        }
    }
    return 0;
}

9. 打印口诀表

对任意给定的一位正整数N,输出从1*1N*N的部分口诀表。

输入格式:

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

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  
#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n);
    int i, j;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=i; j++)
        {
            printf("%d*%d=%-4d", j, i, i*j);
        }
        printf("\n");
    }
    return 0;
}

10. 求特殊方程的正整数解

对任意给定的正整数N,求方程
x2+y2=N x^2+y^2=Nx2+y2=N的全部正整数解。

输入格式:

输入在一行中给出正整数N(≤10000)。

输出格式:

输出方程X2+Y2=N的全部正整数解,其中XY。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution

输入样例1:

884

输出样例1:

10 28
20 22

输入样例2:

11

输出样例2:

No Solution
import math

n = int(input().strip())
ans_dict = {}
for i in range(1, int(math.sqrt(n)) + 1):
    for j in range(1, i + 1):
        if i * i + j * j == n:
            ans_dict[j] = i
if len(ans_dict) == 0:
    print("No Solution")
else:
    # 按键排序
    ans_list = sorted(ans_dict.items(), key=lambda x: x[0])
    for i in ans_list:
        print(f'{i[0]} {i[1]}')


11. 约分最简式

分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:

输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:

  • 对于C语言,在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
  • 对于Python语言,用a,b=map(int, input().split('/'))这样的代码来处理这个斜杠。

输出格式:

在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如
5/6表示6分之5。

输入样例:

66/120

输出样例:

11/20
def gcd(a, b):
    """求a和b的最大公约数"""
    if a > b:
        a, b = b, a
    ans = 1
    for i in range(2, a + 1):
        if (a % i == 0) and (b % i == 0):
            ans = i
    return ans


a, b = map(int, input().split('/'))
gcd = gcd(a, b)  # 求a和b的最大公约数
# 分子分母整除最大公约数
a = a // gcd
b = b // gcd
print(f'{a}/{b}')

12. 单词长度

你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。

输入格式:

输入在一行中给出一行文本,以.结束

输出格式:

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例:

It's great to see you here.

输出样例:

4 5 2 3 3 4
str = input().strip().strip('.').split(' ')
list_len = [len(i) for i in str if i]
for i in range(len(list_len)):
    if i != len(list_len)-1:
        print(list_len[i], end=' ')
    else:
        print(list_len[i])

13. 删除字符串中的子串

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:

输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:

在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:

Tomcat is a male ccatat
cat

输出样例:

Tom is a male 
def remove_substr(str1, str2):
    while str1.find(str2) != -1:
        str1 = str1.replace(str2, '')
    return str1


s1 = input()
s2 = input()
print(remove_substr(s1, s2))

14. 说反话

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:

Hello World   Here I Come

输出样例:

Come I Here World Hello
str1 = input().strip().split(' ')
list1 = [i for i in str1 if i]
print(' '.join(list1[::-1]))

15. 有理数加法

计算两个有理数的和。

输入格式:

输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:

在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:

1/3 1/6

输出样例1:

1/2

输入样例2:

4/3 2/3

输出样例2:

2
def gcd(a, b):
    if a > b:
        a, b = b, a
    ans = 1
    for i in range(2, a + 1):
        if (a % i == 0) and (b % i == 0):
            ans = i
    return ans

list1 = input().strip().split(' ')
num1, num2 = list1[0], list1[1]
a1, b1 = map(int, num1.split('/'))
a2, b2 = map(int, num2.split('/'))
# 得到相加后的分子、分母
a = a1 * b2 + a2 * b1
b = b1 * b2
gcd = gcd(a, b)   # 求分子和分母的最大公约数
# 对分子、分母进行化简
a = a // gcd
b = b // gcd
if b == 1:
    print(f'{a}')
else:
    print(f'{a}/{b}')

16. 通讯录的录入与显示

通讯录中的一条记录包含下述基本信息:姓名、出生日期、性别、固定电话号码、移动电话号码。
本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。

输入格式:

输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女”;固话手机均为不超过15位的连续数字,前面有可能出现+

在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。

输出格式:

对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日的格式输出该记录。若要查询的记录不存在,则输出Not Found

输入样例:

3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086
2 1 7

输出样例:

LaoLao 057187951100 +8618618623333 F 1967/11/30
Not Found
n = int(input())
contacts = []
for i in range(n):
    name, birth, sex, fixed, mobile = input().strip().split(' ')
    contacts.append({'name': name, 'fixed': fixed, 'mobile': mobile, 'sex': sex, 'birth': birth})
numbers = [int(i) for i in input().strip().split(' ')]
for i in numbers[1:]:
    if 0 <= i <= n - 1:
        # print(contacts[i].values())
        print(' '.join(list(contacts[i].values())))
    else:
        print('Not Found')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里逆天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值