【基础编程题目集编程题及其答案】

python江湖

  • 7-1 厘米换算英尺英寸~15
    • 题解:
  • 7-2 然后是几点~15
    • 题解:
  • 7-3 逆序的三位数~10
    • 题解:
  • BCD解密~10
    • 题解:
  • 7-5 表格输出~5
    • 题解:
  • 7-6 混合类型数据格式化输入~5
    • 题解:
  • 7-7 12-24小时制~15
    • 题解:
  • 7-8 超速判断~10
    • 题解:
  • 7-9 用天平找小球~10
    • 题解:
  • 7-10 计算工资~15
    • 题解:
      • 休息一眼-10:
  • 7-11 分段计算居民水费~10
    • 题解:
  • 7-12 两个数的简单计算器~10
    • 题解:
  • 7-13 日K蜡烛图~15
    • 题解:
  • 7-14 求整数段和~15
    • 题解:
  • 7-15 计算圆周率~15
    • 题解:
  • 7-16 求符合给定条件的整数集~15
    • 题解:
  • 7-17 爬动的蠕虫~15
    • 题解:
  • 7-18 二分法求多项式单根~20
  • 7-19 支票面额~15
    • 题解:
  • 7-20 打印九九口诀表~15
    • 题解:
  • 7-21 求特殊方程的正整数解~15
    • 题解:
  • 7-22 龟兔赛跑~20
    • 题解:
  • 7-24 约分最简分式~15
    • 题解:
  • 7-25 念数字~15
    • 题解:
  • 7-26 单词长度~15
    • 题解:
  • 7-27 冒泡法排序~20
    • 题解:
  • 7-28 猴子选大王~20
  • 7-29 删除字符串中的子串~20
    • 题解:
  • 7-30 字符串的冒泡排序~20
    • 题解:
  • 7-31 字符串循环左移~20
    • 题解:
  • 7-32 说反话-加强版~20
    • 题解:
  • 7-33 有理数加法~15
    • 题解:
  • 7-34 通讯录的录入与显示~10
    • 题解:
  • 7-35 有理数均值~20
    • 题解:
  • 7-36 复数四则运算~15
    • 题解:
  • 7-37 整数分解为若干项之和~20
    • 题解:
  • 7-38 数列求和-加强版~20
    • 题解:

这些编程题目也是弄了许久才弄出来的,大家有需要的可以看看,如果有什么不足的地方,还请大家多多指教。毕竟,我们可以一起加油,共同进步,对吧


7-1 厘米换算英尺英寸~15

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

输入格式:

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

输出格式:

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

输入样例:

170

输出样例:

5 6

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

n = int(input())
foot = n // 0.3048 // 100       # 注意这里用//(整除
inch = 12*(n/(0.3048*100)-foot) # 这样就可得出题目所需要的整数值
print("%d %d" % (foot, inch))

7-2 然后是几点~15

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

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

输入格式:

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

输出格式:

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

输入样例:

1120 110

输出样例:

1310

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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

sj, m = map(int, input().split())
nowH = sj // 100                # 得到时间的前两位,即小时数
nowM = sj % 100                 # 得到时间的后两位,即分钟数
newSj = nowH * 60 + nowM + m    # 小时数转化为分钟数,在全部相加,得出全部分钟数
newH = newSj // 60              # 注意,必须得用//
newM = newSj % 60
print("%d%02d" % (newH, newM))

7-3 逆序的三位数~10

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

输入格式:

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

输出格式:

输出按位逆序的数。

输入样例:

123

输出样例:
321
鸣谢安阳师范学院软件学院李康康同学补充数据!

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

n = input()
n = list(n)                                         # 将要输出的转换为列表,便于逆序
# print(n)
a, b, c = int(n[0]), int(n[1]), int(n[2])
if n[0] != '0' and n[1] == '0' and n[2] == '0':     # 当后两位都为0时,输出结果只是第一位
    print(n[0])
elif n[0] != '0' and n[1] != '0' and n[2] == '0':   # 当最后一位为0时,输出结果时一二位
    print(n[1], n[0], sep='', end='')
else:                                               # 除了以上情况,其他的都是全部逆序输出即可
    print(c, b, a, sep='', end='')

BCD解密~10

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

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

输入格式:

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

输出格式:

输出对应的十进制数。

输入样例:

18

输出样例:

12

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

n = int(input())
a = n // 16
b = n % 16
c = a * 10 + b
print("%d" % c)

下面这种比较简单,用了切片的方法

n = int(input())
h = hex(n)
print(h[2:])    # 切片

7-5 表格输出~5

本题要求编写程序,按照规定格式输出表格。

输入格式:
本题目没有输入。

输出格式:
要求严格按照给出的格式输出下列表格:

------------------------------------
Province      Area(km2)   Pop.(10K)
------------------------------------
Anhui         139600.00   6461.00
Beijing        16410.54   1180.70
Chongqing      82400.00   3144.23
Shanghai        6340.50   1360.26
Zhejiang      101800.00   4894.00
------------------------------------

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

print(
'''------------------------------------
Province      Area(km2)   Pop.(10K)
------------------------------------
Anhui         139600.00   6461.00
Beijing        16410.54   1180.70
Chongqing      82400.00   3144.23
Shanghai        6340.50   1360.26
Zhejiang      101800.00   4894.00
------------------------------------''', end='')

7-6 混合类型数据格式化输入~5

本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:

输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:

在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:

2.12 88 c 4.7

输出样例:

c 88 2.12 4.70

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

f1, b, c, f2 = input().split()
f1, f2 = float(f1), float(f2)
b = int(b)
print("%s %d %.2f %.2f"%(c,b,f1,f2))    # 注意字符的%s对应输出


7-7 12-24小时制~15

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

输入格式:

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

提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。

输出格式:

在一行中输出这个时间对应的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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

a, b = map(int, input().split(':'))     # 将小时数和分钟数按整型输入,中间以:隔开
if a > 12:
    print("%d:%d PM" % ((a-12), b))     # 超过12点的 PM
elif a == 12:                           # 处于12点的 PM
    print("%d:%d PM" % (a, b))
else:                                   # 低于12点 AM
    print("%d:%d AM" % (a, b))

7-8 超速判断~10

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

v = int(input())
if v > 60:      # 超速
    print(f"Speed: {v} - Speeding")
else:           # 未超速
    print(f"Speed: {v} - OK")

7-9 用天平找小球~10

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

输入格式:

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

输出格式:

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

输入样例:

1 1 2

输出样例:

C

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

a, b, c = map(int, input().split())
if a == b and (a != c or b != c):       # 如果a, b球重量相等,且a球或者b球和c球重量不同
    print("C")
elif b == c and (b != a or c != a):     # 如果b, c球重量相等,且b球或者c球和a球重量不同
    print("A")
else:
    print("B")

7-10 计算工资~15

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

输入格式:

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

输出格式:

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

输入样例1:

5 40

输出样例1:

2000.00

输入样例2:

3 50

输出样例2:

1650.00

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

a, b = map(int, input().split())
if b <= 40:         # 一周内工作时间不超过40小时
    if a >= 5:      # 符合上面条件,且是老职工
        print("%.2f" % (b*50))
    else:           # 符合上面条件,且是新职工
        print("%.2f" % (b*30))
else:               # 一周内工作时间超过40小时的
    if a >= 5:
        print("%.2f" % (40*50+((b-40)*50)*1.5))
    else:
        print("%.2f" % (40*30+((b-40)*30)*1.5))


休息一眼-10:

想提升自己的意志力,就必须认识自己的弱点,克服弱点,这样才能不被他牵制。

弱点不可怕,不能够改变弱点才可怕。


7-11 分段计算居民水费~10

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。

输入格式:

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

输出格式:

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

输入样例1:

12

输出样例1:

16.00

输入样例2:

16

输出样例2:

22.50

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

x = int(input())
y = 0               # 存储最后的水费
if x < 15:          # 当用水不超过15吨
    y = 4*x/3
else:
    y = 2.5*x - 17.5
print("%.2f" % y)   # 结果保留两位小数

7-12 两个数的简单计算器~10

本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。

输入格式:

输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。

输出格式:

当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR

输入样例1:

-7 / 2

输出样例1:

-3

输入样例2:

3 & 6

输出样例2:

ERROR

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

a, b, c = input().split()       # b为运算符号
a, c = int(a), int(c)
# 运算符只能为这些
if b == '+' or b == "-" or b == "*" or b == "/" or b == "%":   
    if b == '+':
        print(a+c)
    elif b == '-':
        print(a-c)
    elif b == '*':
        print(a*c)
    elif b == '%' and c == 0:
        print("ERROR")
    elif b == '%':
        print(a % c)
    elif b == '/' and c == 0:
        print("ERROR")
    elif b == '/':
        print(int(a/c))
else:                           # 其它运算符则为错误
    print("ERROR")

7-13 日K蜡烛图~15

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

如果CloseBW-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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

Open, High, Low, Close = map(float, input().split())
flag1, flag2 = 0, 0
if Close<Open:
    ge = 'BW-Solid'
elif Close>Open:
    ge = 'R-Hollow'
else:
    ge = 'R-Cross'
if Low < min(Open, Close):
    a1 = 'Lower Shadow'
    flag1 = 1
if High > max(Open, Close):
    a2 = 'Upper Shadow'
    flag2 = 1
if flag1 and flag2:
    print(ge, 'with', a1, 'and', a2)
elif flag1:
    print(ge, 'with', a1)
elif flag2:
    print(ge, 'with', a2)
else:
    print(ge)

7-14 求整数段和~15

给定两个整数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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

A, B = map(int, input().split())    # map()强制将所输入的转换为整型
sum1 = 0    # 存储所有值的和
r = 0       # 存储个数
for i in range(A, B+1):             # 考虑为[A, B]的区间内
    r += 1                          # 个数循环增加
    sum1 += i                       # 随循环值的相加
    print("{:>5d}".format(i), end='')
    if r % 5 == 0 or i == B:        # 5个值换行, 并且循环结束后,再次换行
        print()
print("Sum = %d" % sum1)

7-15 计算圆周率~15

根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。

2
π
​
 =1+ 
3
1+ 
3×5
2!
​
 + 
3×5×7
3!
​
 ++ 
3×5×7×⋯×(2n+1)
n!
​
 +

输入格式:

输入在一行中给出小于1的阈值。

输出格式:

在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

输入样例:

0.01

输出样例:

3.132157

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

f = float(input())
f_z, f_m = 1, 1
a, j_g = 1, 1
sum1 = 0
while f<j_g:
    f_z *= a
    f_m *= (2*a+1)
    j_g = f_z / f_m
    sum1 += j_g
    a += 1
s = 2*(1+sum1)
print("%.6f" % s)

7-16 求符合给定条件的整数集~15

给定不超过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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

n = int(input())    # 输入起始值
a = 0               # 存储符合条件的次数
for i in range(n, n+4):
    for j in range(n, n+4):
        for k in range(n, n+4):
            if i != j and i != k and j != k:    # 3个值不能有重复的
                a += 1
                if a < 6:
                    print(str(i*100+j*10+k)+" ", end='')
                else:
                    a = 0
                    print(str(i*100+j*10+k)+"\n", end='')
 

7-17 爬动的蠕虫~15

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:

输入在一行中顺序给出3个正整数N、U、D,其中D

输出格式:

在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:

12 3 1

输出样例:

11

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

N, U, D = map(int, input().split())
m, s = 0, 0
while D < U:
    s += U
    m += 1
    if s >= N:
        print(m)
        break
    else:
        s -= D
        m += 1

7-18 二分法求多项式单根~20

二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f®=0。

二分法的步骤为:

检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。
本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a,b]内的根。

在给定区间[a,b]内的根。

输入格式:

输入在第1行中顺序给出多项式的4个系数a3​​、a2​​、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式:

在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:

3 -1 -3 1
-0.5 0.5

输出样例:

0.33

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

这个题我也做不了,放在这里,如果有哪位大佬会做的,希望不吝赐教,在此先表示由衷的感谢。


7-19 支票面额~15

一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?

输入格式:

输入在一行中给出小于100的正整数n。

输出格式:

在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。

输入样例1:

23

输出样例1:

25.51

输入样例2:

22

输出样例2:

No Solution

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

n = int(input())
flag = True     # flag作为标记
for i in range(100):
    for j in range(100):
        if 2*i*100+2*j+n == 100*j+i:
            print(f'{i}.{j}')
            flag = False
if flag:
    print('No Solution')

7-20 打印九九口诀表~15

下面是一个完整的下三角九九口诀表:

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  
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

本题要求对任意给定的一位正整数N,输出从1*1到N*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  

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

n = int(input())
for i in range(1, n+1):
    for j in range(1, i+1):
        # 等号右边数字占四位、左对齐(测试点)
        print("{}*{}={:<4d}".format(j, i, i*j), end='')
    print()

7-21 求特殊方程的正整数解~15

本题要求对任意给定的正整数N,求方程X
2
+Y
2
=N的全部正整数解。

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

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

输入样例1:

884

输出样例1:

10 28
20 22

输入样例2:

11

输出样例2:

No Solution

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

N = int(input())
flag = True
for i in range(100):
    for j in range(100):
        if i**2+j**2==N and i<=j:   # i, j按递增的顺序输出
            print(i, j)
            flag = False
            break
if flag:
    print("No Solution")

7-22 龟兔赛跑~20

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^, 平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:

242

输出样例:

@_@ 726

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

t = int(input())
wg, tz = 0, 0
a = 1           # 存储开始跑的时间
while a <= t:   # 当跑的时间达到比赛时间结束
    wg += 3
    tz += 9
    if a % 10 == 0 and tz > wg:
        if t-a >= 30:
            a += 30
            wg += 90
        else:
            wg += ((t-a)*3)
            a = t
    a += 1      # 循环往复
if wg < tz:     # 相同时间内,兔子跑的远
    print("^_^", tz)
elif wg > tz:   # 相同时间内,乌龟跑的远
    print("@_@", wg)
else:           # 相同时间内,跑的一样远
    print("-_-", wg)

7-24 约分最简分式~15

分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

# 定义他们的最大公约数,然后将其输入的数除以他们的最大公约数,便是约分后的数啦
def gcd(a, b):
    if a == 0 or b == 0:
        print("invalid input")
        return -1
    elif a>=b:
        return b if a%b == 0 else gcd(b, a%b)
    else:
        return a if b%a == 0 else gcd(a, b%a)


A, B = map(int, input().split('/'))
div = gcd(A, B)
a = A//div
b = B//div
print(str(a)+'/'+str(b))

7-25 念数字~15

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

s = {'0':'ling', '1':'yi', '2':'er', '3':'san', '4':'si', '5':'wu', '6':'liu',
     '7':'qi', '8':'ba', '9':'jiu', '-':'fu'}
n = input()
for i in n[:-1]:
    print(s[i], end=' ')
print(s[n[-1]])

7-26 单词长度~15

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

输入格式:

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

提示:用scanf(“%c”,…);来读入一个字符,直到读到.为止。

输出格式:

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

输入样例:

It's great to see you here.

输出样例:

4 5 2 3 3 4

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

s = list(input().strip('.').split())    # 去掉英语句号.并且转为列表的形式
for i in range(len(s)): 
    if i != len(s)-1:
        print("{} ".format(len(s[i])), end='')
    else:
        print(len(s[i]), end='')

7-27 冒泡法排序~20

将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

本题要求对任意给定的K(

输入格式:

输入在第1行中给出N和K(1≤K

输出格式:

在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。

输入样例:

6 2
2 3 5 1 6 4

输出样例:

2 1 3 4 5 6

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

a, b = map(eval, input().split())       # map()强制将所输入的都去掉字符
ns = list(map(eval, input().split()))   # 同上,只是多了一步,即生成列表
last = a - 1                            # 最后一个下标为总的个数减1

for i in range(b):
    for j in range(last):
        if ns[j] > ns[j+1]:
            temp = ns[j+1]
            ns[j+1] = ns[j]
            ns[j] = temp                # 找出最大一个数放在最后
    last -= 1                           # 注意不能少写这个,否则扫描的次数就不对

for i in range(a-1):
    print(ns[i], end=' ')
print(ns[a-1])

7-28 猴子选大王~20

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

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

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

n = int(input())
monkey = []
ts, c = 0, 0			# 存储两个变量,分别是每次被淘汰和有机会被选中的
if n > 0 and n <= 1000:     # 这一句可以不用的
    for i in range(1, n+1):
        monkey.append(i)	# 将符合条件的追加到空列表mokey中
    while len(monkey) > 1:	# 当列表长度超过1时
        ts += 1
        c += 1
        if c > len(monkey):
            c = 1
        if ts == 3:
            ts = 0
            monkey.pop(c - 1)	# 每每淘汰一次
            c -= 1				# 知道最后只剩下一个
    print(monkey[0])

7-29 删除字符串中的子串~20

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

输入格式:

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

输出格式:

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

输入样例:

Tomcat is a male ccatat
cat

输出样例:

Tom is a male 

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

s1 = input()
s2 = input()
flag = 1
while flag:            # 若无子字符串在内则跳出循环
    flag = 0
    if s2 in s1:
        s1 = s1.replace(s2, '')
        flag = 1        # 起标记作用
print(s1)

7-30 字符串的冒泡排序~20

我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(

输入格式:

输入在第1行中给出N和K(1≤K小写英文字母组成的非空字符串。

输出格式:

输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。

输入样例:

6 2
best
cat
east
a
free
day

输出样例:

best
a
cat
day
east
free

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

n, k = map(int, input().split())    # map()强制将所输入的所有数分别转化为整型
s = []                              # 存储空列表
for i in range(n):                  # 输出n行
    s.append(input())
for i in range(k):                  # 扫描几次(依题意)
    for j in range(n-i-1):
        if s[j] > s[j+1]:
            item = s[j]
            s[j] = s[j+1]
            s[j+1] = item           # 根据扫描次数一次次把最大的数放到最后
for i in range(n):
    print(s[i])

7-31 字符串循环左移~20

输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入格式:

输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。

输出格式:

在一行中输出循环左移N次后的字符串。

输入样例:

Hello World!
2

输出样例:

llo World!He

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

s = str(input())
n = int(input())
if n>len(s):        # 如果超过了,减超过的部分
    n -= len(s)
s = s[n:]+s[:n]
print(s)

7-32 说反话-加强版~20

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

输入格式:

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

输出格式:

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

输入样例:

Hello World   Here I Come

输出样例:

Come I Here World Hello

感谢杭州电子科技大学李卫明老师修正数据! 感谢浙江工业大学之江学院石洗凡老师修正测试点提示。

代码长度限制
16 KB
时间限制
300 ms
内存限制
64 MB

题解:

try:
    s = list(input().split())
    for i in s[:-len(s):-1]:    # 从后往前遍历
        print(i+" ", end='')
    print(s[0])
except IndexError:
    exit(0)

7-33 有理数加法~15

本题要求编写程序,计算两个有理数的和。

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

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

输入样例1:

1/3 1/6

输出样例1:

1/2

输入样例2:

4/3 2/3

输出样例2:

2

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

s, q = input().split()
a, b = s.split("/")     # split('/')表示a, b以/隔开
c, d = q.split("/")
a, b, c, d = int(a), int(b), int(c), int(d)
if b == d:
    a += c
else:
    k = b
    b *= d
    a = a * d + c * k
for i in range(2, a):
    while a%i == 0 and b%i == 0:
        a //= i
        b //= i
if b == 1:
    s = a
else:
    s = str(a)+"/"+str(b)

7-34 通讯录的录入与显示~10

通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。
本题要求编写程序,录入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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

n = eval(input())       # 将输入的值去掉字符
le = []
a = []
for i in range(n):
    t = input().split()
    le.append(t)
for le1 in le:
    tmp = le1[1]        # 存储一个值,便于交换后面的变量
    le1[1] = le1[3]
    le1[3] = le1[2]
    le1[2] = le1[4]
    le1[4] = tmp
# print(le1)
sy = tuple(map(eval, input().split()))
for i in range(sy[0]):
    d = sy[i+1]
    # print(d)
    if 0 <= d < n:
        a = le[d]
        # print(a)
        print(a[0], a[1], a[2], a[3], a[4])
    else:
        print("Not Found")

7-35 有理数均值~20

本题要求编写程序,计算N个有理数的平均值。

输入格式:

输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式:

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

输入样例1:

4
1/2 1/6 3/6 -5/10

输出样例1:

1/6

输入样例2:

2
4/3 2/3

输出样例2:

1

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

from fractions import Fraction
n = int(input())
lst = map(Fraction, input().split())
print(sum(lst)/n)

7-36 复数四则运算~15

本题要求编写程序,计算2个复数的和、差、积、商。

输入格式:

输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1iC2=a2+b2i的实部和虚部。题目保证C2不为0。

输出格式:

分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。

输入样例1:

2 3.08 -2.04 5.06

输出样例1:

(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i

输入样例2:

1 1 -1 -1.01

输出样例2:

(1.0+1.0i) + (-1.0-1.0i) = 0.0
(1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
(1.0+1.0i) * (-1.0-1.0i) = -2.0i
(1.0+1.0i) / (-1.0-1.0i) = -1.0

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

题解:

这个题运行结果都是对的,但不知道为什么,测试出来还是零分,不知道哪儿出啦问题,还是没找出来,如果有找到这个错误在哪儿的话,还请指点下。

a1, b1, a2, b2 = map(float, input().split())
a, b = complex(a1, b1), complex(a2, b2)
x1, x2, y1, y2 = round(a.real, 1), round(a.imag, 1), round(a.real, 1), round(a.imag, 1)
if x2 >= 0:
    x2 = '+' + '' + str(x2)
if y2 >= 0:
    y2 = '+' + '' + str(y2)

def cal(a, b, ope):
    if ope == '+':
        c = a + b
        return c
    if ope == '-':
        c = a - b
        return c
    if ope == '*':
        c = a * b
        return c
    if ope == '/':
        c = a / b
        return c

def func(c):
    c1, c2 = round(c.real, 1), round(c.imag, 1)
    if c1 == 0 and c2 == 0:
        print('0.0')
    elif c1 == 0:
        print(f'{c2}i')
    elif c2 == 0:
        print(c1)
    else:
        if c2 > 0:
            print(f'{c1}+{c2}i')
        else:
            print(f'{c1}{c2}i')

print(f'({x1}{x2}i) + ({y1}{y2}i) = ', end='')
func(cal(a, b, '+'))
print(f'({x1}{x2}i) - ({y1}{y2}i) = ', end='')
func(cal(a, b, '-'))
print(f'({x1}{x2}i) * ({y1}{y2}i) = ', end='')
func(cal(a, b, '*'))
print(f'({x1}{x2}i) / ({y1}{y2}i) = ', end='')
func(cal(a, b, '/'))

7-37 整数分解为若干项之和~20

将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。

输入格式:
每个输入包含一个测试用例,即正整数N (0

输出格式:
按递增顺序输出N的所有整数分解式子。递增顺序是指:对于两个分解序列N​​ ={n​1​​,n2,⋯}和N2={m1,m​2,⋯},若存在i使得n1=m1,⋯,ni=mi,但是ni+1

输入样例:

7

输出样例:

7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
7=2+5;7=3+4;7=7

代码长度限制
16 KB
时间限制
800 ms
内存限制
64 MB

题解:

def main():
    n = int(input())
    f(n, 1, str(n) + '=')


count = 0

def f(n, s_num, out=''):
    global count
    for i in range(s_num, n // 2 + 1):
        op = out
        op += str(i) + '+'
        f(n - i, i, op)

    if n == s_num:
        print(out + str(n), end='')
        count += 1
        if (count % 4) == 0:
            print()
        elif '+' in out:
            print(';', end='')
        return

    f(n, n, out)


main()

7-38 数列求和-加强版~20

给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。

输入格式:

输入数字A与非负整数N。

输出格式:

输出其N项数列之和S的值。

输入样例:

1 3

输出样例:

123

代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB

题解:

a, n = map(int, input().split())    # map强制转换为整型
add = 0
l = [0]*100000
# print(l)
if n == 0:                          # 特殊情况,无论多少个0相加,还是0
    print("0")
for i in range(n, 0, -1):           # n从后往前遍历
    add = (i*a+add)//10
    l[i-1] = add
if add != 0:
    print(add, end='')
for i in range(1, n+1):
    if n == i:
        print((i*a) % 10, end='')
    else:
        print((i*a+l[i]) % 10, end='')

你可能感兴趣的:(算法,开发语言,python,PTA)