[Python] 编程习题练习

题目

1. 标题计算1到M(含M)之间的合数数量,输出其值。
输入说明:一个正整数M(M<10000)。
输出说明:输出合数的数量。
输入样例:12
输出样例:6

2. 对于整数区间[N,M],已知0<N<M<100000,试找出区间内满足条件的元素,筛选条件是:它的数位上各个数字的平方和大于元素本身的数,并按照升序顺序输出。
输入说明:两个整数N 和M。
输出说明:顺序输出元素数位上各个数字的平方和大于元素本身的数。
输入样例:21 25
输出样例:25
说明:例如22的数位数字为2,2,这两个数字的平方和为8,小于22,不满足筛选条件所以不输出;25的数位数字为2,5,这两个数字平方和为29,大于25,满足筛选条件,所以将25输出。

3. 求非负整数m,n的最大公约数

4. 输入一串字符,由字母、数字和空格组成,长度<1000,判断其中是否存在日期格式的数据。日期格式的数据具有如下的特征,连续包含年份和月份信息。年份信息是指连续的四个数字,之后是Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec这些字符串之一,如”2019Nov”就是符合日期格式要求的数据。
输入说明: 输入一个字符串。
输出说明: 输出包含满足日期格式的字符子串;如果不包含,则输出2000Jan。
输入样例1: Todayis2019Nov15th.
输出样例1: 2019Nov
输入样例2: Todayisasunnyday.
输出样例2: 2000Jan
输入样例3: OnNov05,nothing happen.
输出样例3: 2000Jan

5. 平面上有N个矩形(编号依次为1,2,…, N),每个矩形可用它的左下角和右上角顶点坐标来表示(默认该矩形的4条边分别两两平行于X轴或Y轴,所以确认这2个顶点后,矩形是唯一的),现在给出一些矩形,规定它们的面积各不相同,请输出面积第三大的矩形序号及其面积。
输入说明:第一行输入一个整数N(3<=N<=1000),之后N行,每行有两个二维坐标(x,y),分别表示对应矩形的左下角和右上角的顶点坐标。
输出说明:面积第三大的矩形序号和它的面积,中间用空格隔开。
输入样例:5
0 0 1 2
1 2 5 5
0 0 3 5
1 2 5 6
4 3 8 8
输出样例:3 15

6. 某机械公司生产两种产品。A的单件利润分别是100元,B的单件利润是150元。每种产品由三种材料构成,现给出每种材料的库存(库存小于100000),求利润最大的生产方案。
输入说明: 第一行给出生产每件A产品所需要的三种材料数量;
第二行给出生产每件B产品所需要的三种材料数量;
第三行给出三种材料的库存数量。
输出说明: 输出利润最大生产方案所对应的每种产品的生产数量(按照产品A、产品B的顺序)和利润最大值,每个数值间用空格隔开。
输入样例: 3 1 2
5 2 2
30 4 6
输出样例:2 1 350

样例信息提示:每件产品A需要材料一3、材料二1、材料三2;每件产品B需要材料一5、材料二2、材料三2。目前库存材料一为30、材料二为4、材料三为6。采用生产A产品2件、B产品1件的生产方案,利润为350,达到利润最大值。

解答

  1. 计算1到M(含M)之间的合数数量,输出其值。
    输入说明:一个正整数M(M<10000)。
    输出说明:输出合数的数量。
    输入样例:12
    输出样例:6
"""合数:除1和它本身之外还能被其他正整数整除"""
m = int(input())
n = 0
for i in range(4, m+1):
    for j in range(2,int(i**0.5)+1):
        if i % j == 0:
            n += 1
            break
print(n)

截图
在这里插入图片描述

  1. 对于整数区间[N,M],已知0<N<M<100000,试找出区间内满足条件的元素,筛选条件是:它的数位上各个数字的平方和大于元素本身的数,并按照升序顺序输出。
    输入说明:两个整数N 和M。
    输出说明:顺序输出元素数位上各个数字的平方和大于元素本身的数。
    输入样例:21 25
    输出样例:25
    说明:例如22的数位数字为2,2,这两个数字的平方和为8,小于22,不满足筛选条件所以不输出;25的数位数字为2,5,这两个数字平方和为29,大于25,满足筛选条件,所以将25输出。
n, m = map(int, input('输入两个整数m和n(0<N<M<100000):').split())
for i in range(n, m + 1):
    e = i
    su = 0
    while e > 0:
        su = (e % 10) ** 2 + su
        e = e // 10
    if su > i:
        print(i, end=' ')
print()

在这里插入图片描述

  1. 求非负整数m,n的最大公约数
"""0和非负整数m的最大公约数是m本身"""
m, n = map(int, input().split())
if m > n:
    m, n = n, m
while True:
    """辗转相除法求最大公约数"""
    r = m % n
    if r == 0:
        print('最大公约数:', n)
        break
    m =n
    n =r

在这里插入图片描述

  1. 输入一串字符,由字母、数字和空格组成,长度<1000,判断其中是否存在日期格式的数据。日期格式的数据具有如下的特征,连续包含年份和月份信息。年份信息是指连续的四个数字,之后是Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec这些字符串之一,如”2019Nov”就是符合日期格式要求的数据。
    输入说明: 输入一个字符串。
    输出说明: 输出包含满足日期格式的字符子串;如果不包含,则输出2000Jan。
    输入样例1: Todayis2019Nov15th.
    输出样例1: 2019Nov
    输入样例2: Todayisasunnyday.
    输出样例2: 2000Jan
    输入样例3: OnNov05,nothing happen.
    输出样例3: 2000Jan

解法一:

st = input()
month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
le = len(st)
if le < 7:
    print('2000Jan')
else:
    i = 0
    flag = False
    while i < le:
        if st[i].isdigit():
            if st[i:i+4].isdigit() and st[i+4:i+7] in month:
                print(st[i:i+7])
                i += 6
                flag = True
            i += 1
        else:
            i += 1
    if not flag:
        print('2000Jan')

解法二

st = input()
month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
flag = False
for i in range(len(st)):
    if st[i:i+3] in month:
        if st[i-4:i].isdigit():
            print(st[i-4:i+3])
            flag = True
if not flag:
    print('2000Jan')

在这里插入图片描述

  1. 平面上有N个矩形(编号依次为1,2,…, N),每个矩形可用它的左下角和右上角顶点坐标来表示(默认该矩形的4条边分别两两平行于X轴或Y轴,所以确认这2个顶点后,矩形是唯一的),现在给出一些矩形,规定它们的面积各不相同,请输出面积第三大的矩形序号及其面积。
    输入说明:第一行输入一个整数N(3<=N<=1000),之后N行,每行有两个二维坐标(x,y),分别表示对应矩形的左下角和右上角的顶点坐标。
    输出说明:面积第三大的矩形序号和它的面积,中间用空格隔开。
    输入样例:
    5
    0 0 1 2
    1 2 5 5
    0 0 3 5
    1 2 5 6
    4 3 8 8
    输出样例:
    3 15
num = int(input())
s = [0, 0, 0]
f = [0, 0, 0]  # 序号
for i in range(num):
    a = list(map(int, input().split()))
    ss = abs((a[0] - a[2]) * (a[1] - a[3]))
    if ss > s[0]:
        s[0], s[1], s[2] = ss, s[0], s[1]
        f[0], f[1], f[2] = i + 1, f[0], f[1]
    elif ss > s[1]:
        s[1], s[2] = ss, s[1]
        f[1], f[2] = i + 1, f[1]
    elif ss > s[2]:
        s[2] = ss
        f[2] = i + 1
print(f[2], ' ', s[2])

在这里插入图片描述

  1. 某机械公司生产两种产品。A的单件利润分别是100元,B的单件利润是150元。每种产品由三种材料构成,现给出每种材料的库存(库存小于100000),求利润最大的生产方案。
    输入说明: 第一行给出生产每件A产品所需要的三种材料数量;
    第二行给出生产每件B产品所需要的三种材料数量;
    第三行给出三种材料的库存数量。
    输出说明: 输出利润最大生产方案所对应的每种产品的生产数量(按照产品A、产品B的顺序)和利润最大值,每个数值间用空格隔开。
    输入样例: 3 1 2
    5 2 2
    30 4 6
    输出样例:2 1 350

样例信息提示:每件产品A需要材料一3、材料二1、材料三2;每件产品B需要材料一5、材料二2、材料三2。目前库存材料一为30、材料二为4、材料三为6。采用生产A产品2件、B产品1件的生产方案,利润为350,达到利润最大值。

解法一

"""A,B产品的单件利润"""
Pa = 100
Pb = 150
"""手动输入A,B的三种材料使用量和材料库存"""
A = list(map(eval, input().split()))
B = list(map(eval, input().split()))
stock = list(map(eval, input().split()))
"""求出如果全部材料都制作A或者全部材料都用来制作B时能够制作A或B的数量"""
AS = min(stock[0] // A[0], stock[1] // A[1], stock[2] // A[2])
BS = min(stock[0] // B[0], stock[1] // B[1], stock[2] // B[2])
"""穷举法,从全部制作A到全部制作B都放到一个列表中,所有可能的结果"""
res = [(AS, 0), (0, BS)]
for i in range(1, AS):
    for j in range(1, BS):
        res.append((i, j))  # i最大不超过AS,j最大不超过BS.所以把所有情况插入表格
"""将A,B和其在对应数量下的利润插入到另一个表格"""
gain = []
for i in res:
    gain.append((i[0], i[1], i[0] * Pa + i[1] * Pb))

"""打印出利润最大的一项"""
for i in max(gain, key=lambda x: x[2]):
    print(i,end=' ')
print()

解法二(区别在于排序)

"""A,B产品的单件利润"""
Pa = 100
Pb = 150
"""手动输入A,B的三种材料使用量和材料库存"""
A = list(map(eval, input().split()))
B = list(map(eval, input().split()))
stock = list(map(eval, input().split()))
"""求出如果全部材料都制作A或者全部材料都用来制作B时能够制作A或B的数量"""
AS = min(stock[0] // A[0], stock[1] // A[1], stock[2] // A[2])
BS = min(stock[0] // B[0], stock[1] // B[1], stock[2] // B[2])
"""穷举法,从全部制作A到全部制作B都放到一个列表中,所有可能的结果"""
res = [(AS, 0), (0, BS)]
for i in range(1, AS):
    for j in range(1, BS):
        res.append((i, j))  # i最大不超过AS,j最大不超过BS.所以把所有情况插入表格
"""将A,B和其在对应数量下的利润插入到另一个表格"""
gain = []
for i in res:
    gain.append((i[0], i[1], i[0] * Pa + i[1] * Pb))

"""对gain排序"""
sorted(gain, key=lambda x: x[2])

"""打印出利润最大的一项"""
for i in gain[-1]:
    print(i, end=' ')
print()

解法三(区别在于没有列表)

"""A,B产品的单件利润"""
Pa = 100
Pb = 150
"""手动输入A,B的三种材料使用量和材料库存"""
A = list(map(eval, input().split()))
B = list(map(eval, input().split()))
stock = list(map(eval, input().split()))
"""求出如果全部材料都制作A或者全部材料都用来制作B时能够制作A或B的数量"""
AS = min(stock[0] // A[0], stock[1] // A[1], stock[2] // A[2])
BS = min(stock[0] // B[0], stock[1] // B[1], stock[2] // B[2])
"""穷举法,从全部制作A到全部制作B都计算出所有的利润,把利润最大的记录"""
ga = max([(AS, 0, AS*Pa), (0, BS, BS+Pb)], key=lambda x:x[2])
for i in range(1, AS):
    for j in range(1, BS):
        g = (i, j, i*Pa+j*Pb)
        if g[2]>ga[2]:
            ga = g

"""打印"""
for i in ga:
    print(i, end=' ')
print()

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东篱把酒黄昏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值