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)}')