python练习题
100道python练习,参考链接:https://github.com/woider/PythonExercise#%E9%A2%98%E7%9B%AE-1
题目 1
有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
for i in range(1,5): for j in range(1,5): for k in range(1,5): if j != k and i!=j and i!=k: print(i,j,k)
题目 2
企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
2021-05-14 12:26:23 周五 打卡
I = float(input("请输入当月利润,单位为万元\n")) bns = 0 #初始化奖金总数 cat = [100, 60, 40, 20, 10, 0] #金额分6档 pct = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1] #每档的提成比例 for i in range(6): if I > cat[i]: I = I - cat[i] #注意:刨掉档位金额后,应将值重新赋给I,每一档位分开计算 bns = bns + I * pct[i] #每一档位的奖金累计相加 print('当月应发放奖金总数为%s万元' % bns)
题目 3
一个整数,它加上100和加上268后都是一个完全平方数,请问该数是多少?
在10000以内判断,将该数加上100后再开方,加上268后再开方,如果开方后的结果满足如下条件,即是结果。
import math for i in range(1,10001): a = int(math.sqrt(i+100)) b= int(math.sqrt(i+268)) if a*a==(i+100) and b*b==(i+268): print(i)
题目 4
输入某年某月某日,判断这一天是这一年的第几天?
以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天。
days = [31,28,31,30,31,30,31,31,30,31,30,31] inputText = input() years = inputText[0:4] months = inputText[4:6] day = inputText[6:] if (int(months)%4==0 and int(months)%100 !=0) or int(months)%400==0: days[1]=29 nums=0 for i in range(0,int(months)-1): print(days[i]) nums +=days[i] print(nums+int(day))
题目 5
输入三个整数x,y,z,请把这三个数由小到大输出。
我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
print("*"*50+"请输入第1个数"+"*"*50) num1_input=int(input()) print("*"*50+"请输入第2个数"+"*"*50) num2_input=int(input()) print("*"*50+"请输入第3个数"+"*"*50) num3_input=int(input()) list2=[num1_input,num2_input,num3_input] list1=[1,2,4,56,7,3,3,45,23,45,456,565,3434,232,3] n=len(list1) for i in range(0,n): for j in range(0,n-1-i): if list1[j]>list1[j+1]: list1[j],list1[j+1] = list1[j+1],list1[j] print(list1)
题目 6
斐波那契数列。
斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。
begin=[0,1] listlen=20 result = 1 for i in range(0,listlen-2): nums= begin[i]+begin[i+1] begin.append(nums) print(begin)
题目 7
将一个列表的数据复制到另一个列表中。
使用列表[:]。
list1=[1,2,3,4]
list2 =list1[:]
题目 8
输出 9*9 乘法口诀表。
分行与列考虑,共9行9列,i控制行,j控制列。
for i in range(1,10): for j in range(1,i+1): print("{}*{}={}".format(j,i,i*j),end=" ") print("\n")
题目 9
模拟Linux用户登录。
验证账号和密码,若失败则延迟三秒输出错误信息。
import time root ="root" password="123456" times=1 while times<=3: user_input=input("user:") password_input=input("Enter password:") if user_input == root: if password_input !=password: time.sleep(3) print("账号或密码错误,请重新输入") else: print("欢迎") exit() else: if password_input !=password: time.sleep(3) print("账号或密码错误,请重新输入") else: time.sleep(3) print("账号或密码错误,请重新输入") print("你还有{}次机会!".format(3-times)) times+=1
题目 10
格式化输出当前时间。
使用 time 模块,格式为 yyyy-mm-dd HH:mm:ss。
import time now_time = time.strftime('%Y-%m-%d %H:%M:%S') print(now_time)
题目 11
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
兔子的规律为数列1,1,2,3,5,8,13,21....
2021-04-22 11:54:58 周四 打卡
思路:一对兔子,在成熟期生兔子 月份 刚出生 半成熟 成熟 第1个月 1 0 0 第2个月 0 1 0 第3个月 1 0 1 (成熟并生下一对) 第4个月 1 1 1 (生下一对,3月生下的进入半成熟) 第5个月 2 1 2 (生下一对,2个月生下的进入成熟并生下一对,同时4月生下的进入半成熟) 第6个月 3 2 3 第7个月 5 3 5 规律:1,1,2,3,4,8,13,。。。 ''' fisrt_month = 1 second_month = 1 month=[1,2,3,4,5,6,7,8,9,10,11,12] list1=[fisrt_month,second_month] begin = 0 while begin<12: last=list1[begin]+list1[begin+1] list1.append(last) begin+=1 # print(list1) # print(dict(zip(month,list1))) for i,j in dict(zip(month,list1)).items(): print("第{}个月有{}只兔子".format(i,j*2))
题目 12
判断101-200之间有多少个素数,并输出所有素数。
判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
题目 13
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
利用for循环控制100-999个数,每个数分解出个位,十位,百位。
#2021-04-14 10:01:22 周三
for i in range(100,1000): first=int(str(i)[0]) second = int(str(i)[1]) third = int(str(i)[2]) if i== first**3 + second**3 + third**3: print(i)
题目 14
将一个正整数分解质因数。例如:输入90,打印出90=233*5。
对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
2021-04-29 10:06:31 周四 打卡
class Factorization(): def __init__(self,nums): self.nums = nums self.copy_nums = self.nums #拷贝一个,以便输出格式化 def nums_factor(self): if self.nums == 2: return self.nums else: list1=[] #存放分解的因数 begin = 2 while begin <=self.nums: if self.nums % begin == 0: list1.append(str(begin)) list1.append('*') #以便格式化 self.nums = self.nums /begin else: begin += 1 str_factor="".join(list1) result ="{}={}".format(self.copy_nums,str_factor[:len(str_factor)-1]) #去除最后一个* return result if __name__ == '__main__': print(Factorization(100).nums_factor())
题目 15
利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
程序分析:(a>b)?a:b这是条件运算符的基本例子。
2021-04-28 09:38:36 周三 打卡
#注:未考虑输入为非数字情况 score_input = int(input("请输入成绩:\n")) if score_input >= 90 and score_input <= 100: print("{}分属于等级A".format(score_input)) elif score_input >=60 and score_input <90: print("{}分属于等级B".format(score_input)) elif score_input >=0 and score_input <60: print("{}分属于等级C".format(score_input)) else: print("输入的成绩不规范,请重新输入,成绩在0——100之间")
题目 16
输出指定格式的日期。
使用 datetime 模块。
#2021-04-15 09:38:22 周三
import datetime print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
题目 17
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
利用while语句,条件为输入的字符不为'\n'。
2021-05-12 09:58:15 周三 打卡
def str_numbers(): str_input = input("请输入一行字符串\n") letter=[] #字母 blankSpace=[] #空格 numbers=[] #数字 otherCharacter=[] #其它字符 if str_input == "\n": return "字符为空" else: for i in str_input: if i.isalpha(): #字母 letter.append(i) elif i.isdigit(): #数字 numbers.append(i) elif i ==" ": #空格 blankSpace.append(i) else: #其它字符 otherCharacter.append(i) result = "英文字母为{letter},有{letter_number}个;\n数字为{numbers},有{numbers_number}个;\n空格为{blankSpace},有{blankSpace_number}个;\n其它字符为{otherCharacter},有{otherCharacter_number}个.\n".format(letter=letter,letter_number=len(letter),numbers=numbers,numbers_number=len(numbers),blankSpace=blankSpace,blankSpace_number=len(blankSpace),otherCharacter=otherCharacter,otherCharacter_number=len(otherCharacter)) return result print(str_numbers())
#参考:https://www.cnblogs.com/wangboqi/p/7455240.html
题目 18
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
关键是计算出每一项的值。
#2021-04-16 09:49:45 周三 inputNum=input("请输入数字\n") inputLen=int(input("请输入长度")) s=0 list1=[] for i in range(1,inputLen+1): s=s+int(i*inputNum) print(s)
题目 19
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
请参照程序Python 练习实例14。
题目 20
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
利用循环计算每一次小球落地的高度。
2021-04-17 23:02:00 周六 打卡
hight = 100 n=1 sums=0 while n<=10: sums =sums + hight hight = 0.5*hight #print("第{}次落地时,经过了{}米,反弹了{}米。".format(n,sums,hight)) n+=1 print("第10次落地时,经过了{}米,反弹了{}米。".format(sums,hight))
题目 21
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
采取逆向思维的方法,从后往前推断。
2021-04-18 14:40:42 星期六 打卡
days=10 sums=1 while days>=1: #print("第{}天剩下{}个桃子".format(days,sums)) sums = 2 * sums + 1 days -=1 print("第一天共摘了{}".format(sums))
题目 22
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
先进行排列组合,再挑选符合要求的组合。
2021-05-13 12:53:43 周四 打卡
''' 解析:先进行排列组合,再挑选符合要求的组合。 总的排列组合有3*2*1=6,即: [ [('a','x'),('b','y'),('c','z')], [('a','x'),('b','z'),('c','y')], [('a','y'),('b','z'),('c','x')], [('a','y'),('b','x'),('c','z')], [('a','z'),('b','x'),('c','y')], [('a','z'),('b','y'),('c','x')], ] ''' for i in ['x','y','z']: for j in ['x','y','z']: if i!=j: #print(i,j) for k in['x','y','z']: if (k!=i and k!=j)and i!='x'and k!='x'and k!='z': print("a对阵%s b对阵%s c对阵%s"%(i,j,k))
题目 23
利用循环打印菱形
先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
2021-04-19 16:19:25 周一 打卡
def ling(a): for i in range(1,a+1): result = (a-i+1)*' '+i*'* ' print(result) for j in range(a-1,0,-1): result2 = (a-j+1)*' '+j*'* ' print(result2) ling(4)
题目 24
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
请抓住分子与分母的变化规律。
2021-05-11 09:54:23 周二 打卡
五一放假回家,家中亲人意外离世,没有电脑,中途10天后续补上
def Mark_Sums(): first_mark_numerator = 2 #第一个分数分子 first_mark_denominator = 1 #第一个分数分母 first_mark = first_mark_numerator / first_mark_denominator times = 1 #次数 list1= [first_mark] while times <=20: next_mark_numerator = first_mark_numerator + first_mark_denominator next_mark_denominator = first_mark_numerator next_mark = next_mark_numerator / next_mark_denominator first_mark_numerator = next_mark_numerator first_mark_denominator = next_mark_denominator first_mark = next_mark list1.append(next_mark) times+=1 sums = sum(list1) return sums print(Mark_Sums())
题目 25
求1+2!+3!+...+20!的和。
此程序只是把累加变成了累乘。
2021-04-27 09:51:19 周二 打卡
import math def factorial_values(n): sums = 0 print(math.factorial(1)) for i in range(1,n+1): print("第{}次:{}的阶乘等于{}".format(i,i,math.factorial(i))) sums = sums+math.factorial(i) return sums
题目 26
利用递归方法求5!。
递归公式:fn=fn_1*4!
2021-04-26 10:05:31 周一 打卡
import math def factorial_values(n): if n == 0: return 1 else: return math.factorial(n) print(factorial_values(5))
题目 27
利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
递归实际上是一种函数堆栈。
题目 28
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
2021-04-25 10:17:36 周日 打卡
''' 思路: a b c d e 10 x-6 x-4 x-2 x 是一个等差数列,首项为10,公差为2,求第5项。 等差数列求和公式:an=a1+(n-1)d 前n项和:Sn=n*a1+n(n-1)d/2 或Sn=n(a1+an)/2 ''' first_age=10 xiangcha = 2 print("第5个人{}岁".format(10+(5-1)*2))
题目 29
给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
学会分解出每一位数。
2021-04-21 09:21:53 周三 打卡
#方法1 import random numbers = random.randint(0,99999) str1 = str(numbers) print("这是{}位数".format(len(str1))) for i in str1: print("各位数字分别是{}".format(i))
题目 30
一个5位数,判断它是不是回文数。
回文数,个位与万位相同,十位与千位相同。
2021-04-20 09:49:51 周二 打卡
for i in range(10001,100000): i=str(i) if i[4]==i[0] and i[3]==i[1]: print("{}是回文数!".format(i))