Python巩固基础-基础算法题目练习

2022/4/17 20:12:44

本文主要是介绍Python巩固基础-基础算法题目练习,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

"""
1、写三个for循环,分别循环这四个数字,最内层的循环使用set的去重功能判断是否有重复数字、无则将数字拼接
2、将得到的数字放入一个set集合中,自动去重
3、集合元素的个数即为组成的数字个数
"""
res = set()
for x in range(1, 5):
    for y in range(1, 5):
        for z in range(1, 5):
            if len({x, y, z}) == 3:
                tmp = str(x) + str(y) + str(z)
                res.add(tmp)
print('共组成{}个互不相同且无重复数字的三位数'.format(len(res)))
print('组成的数字如下:')
for i in sorted((list(res))):
    print(i, end=' ')

二、企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

"""
1、获取键盘输入作为利润,注意input获取的输入都为str类型,需要转换为float(注意不要转换为int,若利润有小数则会报错)
2、使用if..elif..条件语句进行判断利润是否在某个区间
3、通过该区间的奖金提成比例、计算对应的奖金数
4、单位为万,便于计算
"""
profit = float(input('请输入利润(单位为万):'))
if profit <= 10:
    res = profit * 0.1
elif profit < 20:
    res = 10 * 0.1 + (profit - 10) * 0.075
elif profit < 40:
    res = 10 * 0.1 + 10 * 0.075 + (profit - 20) * 0.05
elif profit < 60:
    res = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03
elif profit < 100:
    res = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015
else:
    res = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100) * 0.01
print('应发放奖金总数为:{}万'.format(res))

三、一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

# 解法一
"""
1、完全平方数是非负数
2、一个正整数n是完全平方数的充分必要条件是n有奇数个因数(包括1和n本身)
3、如果正整数n的平方根是两个正整数,那么n是完全平方数
4、循环遍历0到10001,计算该数加上100、再加上168是否满足条件
"""
import math
for x in range(10001):
    tmp1 = str(math.sqrt(x + 100)).split('.')[1]
    if len(tmp1) == 1 and tmp1 == '0':
        tmp2 = str(math.sqrt(x + 268)).split('.')[1]
        if len(tmp2) == 1 and tmp2 == '0':
            print(x)

# 解法二
"""
1、将0到100的平方存储在一个list中,
2、循环遍历0到10000,判断加上100、再加上168的数是否在这个list中,是则为需要的结果
"""
my_l = [i*i for i in range(10001)]
for x in range(10001):
    if x + 100 in my_l:
        if x + 268 in my_l:
            print(x)

四、输入某年某月某日,判断这一天是这一年的第几天?

"""
1、将每一个月的天数存储在一个list中
2、先判断月份是否为1月,若是则直接输出天数
3、根据输入的年份判断是否闰年(能被4整除,但不能被100整除的是闰年,能被400整除的是闰年。)
3、若为闰年,二月为29天,平年则保持28天
4、将之前月份的天数加起来,再加上输入的日来计算总的天数,否则直接得出1月天数
"""
days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
in_date = input('请输入年月日(格式为20010120):')
year = in_date[:4]
month = in_date[4:6]
day = in_date[6:]
if int(month) == 1:
    res = int(day)
else:
    if (int(year) % 4 == 0 and int(year) % 100 != 0) or int(year) % 400 == 0:
        days[1] = 29
    sum_days = 0
    for m in range(int(month) - 1):
        sum_days += days[m]
    res = sum_days + int(day)
print('这是这一年的第{}天'.format(res))

五、斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。打印前20个数

"""
1、定义一个初始值为[0, 1]的list
2、每一个新的元素为list[-1]+list[-2],循环18次,将新元素append到列表末尾
"""
init_list = [0, 1]
for x in range(18):
    init_list.append(
        init_list[-1] + init_list[-2]
    )
print(init_list)

六、输出 9*9 乘法口诀表

"""
9*9乘法表如下:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
......
1*9=9 2*9=18 ......
观察可得:每一行都是从1开始计算,第n行就是从1到n去*n
1、总共9行,第一层for循环i从1到9
2、两层for循环,第二层循环从1到i进行运算,按照乘法表格式打印,直到x=i
"""
for i in range(1, 10):
    for x in range(1, i+1):
        print('{}*{}={}'.format(x, i, x*i), end=' ')
    print('\n', end='')

七、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
本题参考知乎https://www.zhihu.com/question/38045513下的回答

"""
1--1     1
2--1     1
3--1+1  大兔子生了一对小兔子a    2
4--1+1+1 a小兔子两个月了,大兔子再生一对b   3
5--1+1+1+1 +1  大兔子再生一对c,a三个月了生一对a-1,b两个月   5
6--1+1+1+1+1 +1+1+1  大兔子再生一对d,a再生一对a-2,b再生一对b-1   8
7--1+1+1+1+1+1  +1+1+1+1+1+1+1  大兔子再生一对e,a生一对,b生一对,c生一对,a-1再生一对  13
初始值兔子为1,年龄为1,过了两个月后增加兔子数为1,新兔子年龄为1,随着月数的增加,兔子年龄到3即可生育
1、因为每对兔子都有一个年龄,根据这个年龄来判断是否能生育,因此定义一个兔子对的类,有一个age属性
2、定义一个兔子对的list,初始值为1个兔子对,该兔子对年龄为1
3、循环月数,每一个月将兔子对的list中每个兔子对的年龄+1,遍历该list中的兔子对,若该兔子对年龄大于等于3,
则给兔子对的list增加一个新的兔子对
4、每个月的兔子对即为兔子对list的len
"""


# 定义一个兔子对的类,有一个age的属性,初始为0
class RabbitPair:
    def __init__(self):
        self.age = 0

    def update(self):
        self.age += 1


def rabbit_num(m):
    # 初始的兔子数为一个兔子对
    rabbits = [RabbitPair()]
    # 循环月数,每个月将每对兔子年龄+1,并且模拟年龄到>=生育一对兔子
    for m in range(m):
        for rb in rabbits:
            rb.update()
            if rb.age >= 3:
                rabbits.append(RabbitPair())
        print(f'第{m+1}个月的兔子数为:{len(rabbits)}对')


month = int(input('请输入月数(正整数):'))
rabbit_num(month)

八、判断101-200之间有多少个素数,并输出所有素数。

"""
素数:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数
1、循环遍历101-200之间的自然数
2、针对每个自然数,生成一个该自然数%从2到此数本身-1的数的结果list
3、如果list中有0,则该数不为素数
"""
result = []
for i in range(101, 201):
    if 0 not in [i % j for j in range(2, i)]:
        result.append(i)
print(f'101-200之间共有{len(result)}个素数,如下:')
print(result)

九、打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

"""
1、循环遍历100到999的自然数
2、将该数转换为字符串,取每一位的数转换为int进行计算,满足条件即为水仙花数
"""
for i in range(100, 1000):
    unit = int(str(i)[0])
    decade = int(str(i)[1])
    hundred = int(str(i)[2])
    if pow(unit, 3) + pow(decade, 3) + pow(hundred, 3) == i:
        print(i)

十、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

"""
1、生成从2到number的质数
2、当number不为1的时候,不断进行循环;
3、针对质数进行for循环遍历,判断number和当前质数是否能整除;
4、若能整除,放入结果的list中,number变为整除后的结果
"""
number = int(input('请输入一个正整数:'))
res_str = str(number) + '='
prime_list = []
res_list = []
for n in range(2, number+1):
    if 0 not in range(2, n):
        prime_list.append(n)
while number > 1:
    for p in prime_list:
        if number % p == 0:
            res_list.append(p)
            number = number // p
            break
print(res_str + '*'.join([str(r) for r in sorted(res_list)]))

十一、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

"""
1、遍历此字符串;
2、针对每个字符进行判断,为对应的类型则进行计数;
"""
in_str = input('请输入一串字符:')
ens = 0
spaces = 0
nums = 0
others = 0
for s in in_str:
    if s.isalpha():
        ens += 1
    elif s.isspace():
        spaces += 1
    elif s.isalnum():
        nums += 1
    else:
        others += 1
print(f'该字符串共有{len(in_str)}个字符,其中:英文字母有{ens}个,空格有{spaces}个,数字有{nums}个,其他字符有{others}个')

十二、求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。

"""
1、输入数字a和相加的个数n;
2、for循环,循环n次,根据a生成需要相加的数字,与前一个数字相加,最终得出结果。
"""
a = int(input('请输入正整数a:'))
n = int(input('请输入相加的个数n:'))
result = 0
for i in range(1, n+1):
    result += int(str(a) * i)
print(f'result={result}')

十三、一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

"""
1、第一次落下的时候,经过100米,第一次反弹50米,给定此初始值;
2、后续每次落下,经过的总距离即为原先的距离加上上次反弹的距离乘2,反弹的高度为上次反弹的高度除以2;
3、需要注意,第一次落下的距离的计算方式与后续不同,因此可以给一个第一次落下和反弹的距离的初始值,后续再统一进行计算。
"""


def distance(times):
    all_distance = 100
    height = 50
    for t in range(2, times+1):
        all_distance += (height * 2)
        height = height / 2
    print(f'第{times}次落地时,共经过{all_distance}米,第{times}次反弹{height}米高')

十四、猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

"""
第10天还剩1个桃子
假设第9天有n个桃子,吃掉了n/2+1个桃子,还剩n-(n/2+1)即n/2-1个
假设第8天有m个桃子,吃掉了m/2+1个,还剩m-m/2+1即m/2-1个

循环9次,设初始桃子数为1,每次循环倒推前一天的桃子数
"""
peach = 1
for d in range(1, 10):
    peach = (peach + 1) * 2
    print(f'第{10-d}天有{peach}个桃子')

十五、30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

"""
1、初始化下船列表和最开始人员列表;
2、当下船人数不足15人时,不断循环;
3、每次循环整个列表时,初始化一个待下船人员的list、并使用count进行计数;
4、当count为9的倍数的时候所指向的人即为需要下船的人,将此人append到待下船列表;
5、循环一次列表结束后,删除待下船列表中的人员(不能边循环边删除,这样列表不断变化,循环时会出错);
最开始把题目理解错了,以为是循环了一次队列后从头开始重新报数,其实是相当于围成一个圈去不断的从1到9报数。
注意:不能边循环边删除,这样列表不断变化,循环时会出错,因此可以使用方法一循环一次后删除待下船的人,或者使用方法二,每次循环的是人员列表的copy,然后满足条件则删除人员列表中的人员
"""
# 方法一:循环一次后删除待下船的人
# off_people = []
# all_people = [i for i in range(1, 31)]
# count = 0
# while len(off_people) < 15:
#     wait_off = []
#     for i in all_people:
#         count += 1
#         if count % 9 == 0:
#             off_people.append(i)
#             wait_off.append(i)
#     for w in wait_off:
#         all_people.remove(w)

# 方法二:每次循环的是人员列表的copy,然后满足条件则删除人员列表中的人员
off_people = []
all_people = [i for i in range(1, 31)]
count = 0
while len(off_people) < 15:
    people_copy = all_people[:]
    for i in people_copy:
        count += 1
        if count % 9 == 0:
            off_people.append(i)
            all_people.remove(i)

print(off_people)

十六、设计一个计算器。可以简单计算2个数字之间的加减乘除。

def calculator():
    num_a = float(input('请输入第一个数字:'))
    operator = input('请输入运算符(+、-、*、/):')
    num_b = float(input('请输入第二个数字:'))
    if operator == '+':
        return num_a + num_b
    elif operator == '-':
        return num_a - num_b
    elif operator == '*':
        return num_a * num_b
    elif operator == '/':
        if num_b == 0:
            return '除数不能是0!'
        return num_a / num_b
    else:
        return '输入的运算符有误!'


print(calculator())

十七、有一组不同高度的台阶,由一个整数数组表示,数组中每个数是台阶的高度。当开始下雨了(水足够多),台阶之间的水坑会积多少呢?
如下图,可以表示为数组[0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1],返回积水量6

"""
1、可以一层一层的计算,从数组第二位开始,找到有多少个中间是0,两边有台阶,即为这一层的积水量
2、数组中最大的数字即为最高的层数high,我们需要找high次
3、每次从数组第二位开始循环,若当前位台阶是0,判断前一位台阶是否为1,若为1,从当前位台阶向后寻找到不为0的台阶,其中的积水量即为不为0的台阶的位置与当前位的距离差
"""
nums = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
high = max(nums)
count = 0
list_len = len(nums)
for h in range(high):
    tmp_list = [1 if i-(h+1) >= 0 else 0 for i in nums]
    for x in range(1, list_len):
        if tmp_list[x] == 0:
            if tmp_list[x-1] > 0:
                for y in range(x, list_len):
                    if tmp_list[y] > 0:
                        count += (y-x)
                        break
print(count)

十八、冒泡排序

"""
冒泡排序:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。
走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
"""


def bubble_sort(nums):
    str_nums = []
    all_nums = []
    for n in nums:
        if isinstance(n, str):
            str_nums.append(n)
        if isinstance(n, int):
            all_nums.append(n)
    for _ in range(len(str_nums)):
        for x in range(len(str_nums) - 1):
            if str_nums[x] > str_nums[x + 1]:
                tmp = str_nums[x]
                str_nums[x] = str_nums[x + 1]
                str_nums[x + 1] = tmp
    for _ in range(len(all_nums)):
        for x in range(len(all_nums) - 1):
            if all_nums[x] > all_nums[x + 1]:
                tmp = all_nums[x]
                all_nums[x] = all_nums[x + 1]
                all_nums[x + 1] = tmp
    return str_nums + all_nums


print(bubble_sort([2, 4, 1, 'hi', 'aka', 88, 0, 32]))

十九、二分法插入排序


二十、随机生成100个3位数的整数,并分别打印出奇数之和、偶数之和。

import random

odds = []
evens = []
for _ in range(100):
    num = random.randint(100, 999)
    if num % 2 == 0:
        evens.append(num)
    else:
        odds.append(num)
print(f'奇数之和:{sum(odds)}')
print(f'偶数之和:{sum(evens)}')


这篇关于Python巩固基础-基础算法题目练习的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程