题目1 :三位数计算 题目2:奖金计算 题目3:完全平方数 题目4:一年中的第几天 题目5:三数排序 题目6:斐波拉契数列 题目7:列表复制 题目8:九九乘法表 题目9:暂停1秒输出 题目10:格式化时间 题目11:兔子生孩子 题目12:素数问题 题目13:水仙花数 题目14:分解质因素 题目15:条件嵌套 题目16:指定格式日期 题目17:统计各类字符个数 题目18:重复数相加 题目19:完数 题目20:球的下落 题目21:猴子偷桃 题目22:比赛名单 题目23:打印图形 题目24:分数序列 题目25:题目相加 题目26:简单递归 题目27:简单递归2 题目28:简单递归3 题目29:分解每一位数 题目30:回文数判断 题目31:判断首字母 题目32:反向输出列表 题目33:连接字符 题目34:函数调用练习 题目35:文本颜色设置 题目36:求100内的素数 题目37:对10个数进行排序 题目38:矩阵运算 题目39:顺序插入列表 题目40:逆序输出列表 题目41:模仿静态变量用法 题目42:学习auto变量用法 题目43:模仿静态变量2 题目44:矩阵相加 题目45:累加 题目46:平方运算 题目47:变量值互换 题目48:数字比较 题目49:使用lambda创建函数 题目50:输出随机数 题目51:使用按位与&操作 题目52:使用按位或|操作 题目53:使用按位异或^操作 题目54:移位操作 题目55:按位取反 题目56:用Circle画圆 题目57:用line画直线 题目58:画方形 题目59:综合画图 题目60:字符串长度 题目61:杨辉三角 题目62:查找字符串 题目63:画椭圆 题目64:利用ellipse 和 rectangle 画图 题目65:一个最优美的图案 题目66:按大小顺序输出数字 题目67:数组里的排序练习 题目68:数组数字移动 题目69:围圈圈游戏 题目70:字符串长度函数 题目1 :三位数计算 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 total=0 for i in range(1,5): for j in range(1,5): for k in range(1,5): if (i!=j) and (i!=k) and (k!=j): print(i*100+j*10+k*1) total+=1 print("There are "+str(total)+" number fitted.") 1 2 3 4 5 6 7 8 题目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,求应发放奖金总数? 程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 Profits=int(input("Please tell me the profit this month: ")) arr=[1000000,600000,400000,200000,100000,0] rat=[0.01,0.015,0.03,0.05,0.075,0.1] Bonus=0 for i in range(0,6): if(Profits>arr[i]): Bonus+=(Profits-arr[i])*rat[i] print((Profits-arr[i])*rat[i]) Profits=arr[i] else: print("0") print("The Bonus is "+str(Bonus)+"元") 1 2 3 4 5 6 7 8 9 10 11 12 题目3:完全平方数 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析:假设该数为 x。 1、则:x + 100 = n2, x + 100 + 168 = m2 2、计算等式:m2 - n2 = (m + n)(m - n) = 168 3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数 4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。 5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。 6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。 7、接下来将 i 的所有数字循环计算即可。 for i in range(1,85): if 168%i == 0: j=168/i if (i>j) and ((i+j)%2==0) and ((i-j)%2==0): m=(i+j)/2 n=(i-j)/2 x=n*n-100 print(int(x)) 1 2 3 4 5 6 7 8 题目4:一年中的第几天 输入某年某月某日,判断这一天是这一年的第几天? 程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天: year=int(input("Year:")) month=int(input("Month:")) day=int(input("Day:")) months = [0,31,59,90,120,151,181,212,243,273,304,334] now=months[month-1]+day if (year%400==0) or (year%4==0)and(year%100!=0): leap=1 else: leap=0 if (leap==1)and(month>2): now+=1 print("It is "+str(now)) 1 2 3 4 5 6 7 8 9 10 11 12 题目5:三数排序 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 程序分析: 方法一:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小,,y同样操作。 x=int(input("x:")) y=int(input("y:")) z=int(input("z:")) min=x mid=y max=z if(x>y): temp=y y=x x=temp if(x>z): temp=z z=x x=temp if(y>z): temp=y y=z z=temp print('order:'+str(x)+' '+str(y)+' '+str(z)) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 方法二:使用列表方法sort order=[] for i in range(0,3): x=int(input("Number:")) order.append(x) order.sort() print("The order from small to big:") for j in order: print(j) 1 2 3 4 5 6 7 8 题目6:斐波拉契数列 题目:斐波那契数列。 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列, 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……。 在数学上,费波那契数列是以递归的方法来定义: F1 = 1 (n=1) F2 = 1 (n=2) Fn = F[n-1]+ F[n-2](n=>2) 方法一:可看成a,b为幽魂附在该数列的最初相邻的两个数上(1,1),每循环一次,就共同前进一个数字(1,2),(2,3)等等。求的第n个数的话,则a前进n-1次就会附身在那个数上。 def fib(n): a,b = 1,1 for i in range(n-1): a,b = b,a+b return a print(fib(100)) 1 2 3 4 5 6 方法二:通过公式,进行递归(运算时间会较长,不信你试试) def fib(n): if(n==1)or(n==2): return 1 return fib(n-1)+fib(n-2) print(fib(60)) 1 2 3 4 5 方案三:如果要求出第n个数时的斐波拉契数列,可以这样。 def fib(n): if(n==1): return [1] if(n==2): return [1,1] fibs = [1,1] for i in range(2,n): fibs.append(fibs[-1]+fibs[-2]) return fibs print(fib(100)) 1 2 3 4 5 6 7 8 9 10 题目7:列表复制 题目:将一个列表的数据复制到另一个列表中。 程序分析:使用列表[:]。 a=[1,2,3] b=a[:] print(b) 1 2 3 题目8:九九乘法表 题目:输出 9*9 乘法口诀表。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。注意print之后会自动换行,需要用end=' '控制一下。 for i in range(1,10): for j in range(1,i+1): print(str(i)+'*'+str(j)+'='+str(i*j),end=' ') print(' ') 1 2 3 4 题目9:暂停1秒输出 题目:暂停一秒输出。 程序分析:使用 time 模块的 sleep() 函数。 import time myD={1:'a',2:'b'} for key,value in dict.items(myD): print(key,value) time.sleep(1) 1 2 3 4 5 题目10:格式化时间 题目:暂停2秒输出,并格式化当前时间。 import time print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) # 暂停2秒 time.sleep(2) print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) 1 2 3 4 5 6 7 题目11:兔子生孩子 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... (斐波拉契数列) def fib(n): if(n==1): return[1] elif(n==2): return[1,1] fibs=[1,1] for i in range(n-2): fibs.append(fibs[-1]+fibs[-2]) return fibs print(fib(5)) 1 2 3 4 5 6 7 8 9 10 题目12:素数问题 题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。这里解释一下: 已知n=(√n)*(√n),假设n=x*y 如果x与y都不是√n,那么当中必定有一个小于√n,一个大于√n。 所以如果n在(2,√n)不能被整除(不存在那个小于√n的数),那么在(√n,n)内也一定不能被整除(也不存在对应大于√n的数)。因此只需判断在(2,√n)就可以了。 from math import sqrt def prime_judge(n): """素数判定""" sign=True for i in range(2,int(sqrt(n)+1)): if(n%i==0): sign=False return sign prime_101_200=[] total=0 for j in range(101,201): if(prime_judge(j)): prime_101_200.append(j) total+=1 print("There are "+str(total)+" prime number.") print(prime_101_200) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 题目13:水仙花数 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 for i in range(100,1000): a=int(i/100) b=int(i/10)%10 c=(i%10) if(i == a**3+b**3+c**3): print(i) 1 2 3 4 5 6 题目14:分解质因素 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 from math import sqrt def prime_judge(n): """素数判定""" sign=True for i in range(2,int(sqrt(n)+1)): if(n%i==0): sign=False return sign def Decomposition_prime_factor(n): """分解质因素""" prime_factor=[] print(str(n)+"=",end='') if prime_judge(n): print(n) else: i=2 while(i<=int(n/2)+1): if n%i==0 and prime_judge(i): prime_factor.append(i) n = n/i i=1 i+=1 #以n=a*b*c形式输出 for j in range(len(prime_factor)): if j==len(prime_factor)-1: print(prime_factor[j]) else: print(str(prime_factor[j])+"*",end='') Decomposition_prime_factor(2018888) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 方法二:进行递归,可简化代码.但只做到90=2×3×3×5里等号后面的式子,哪位高人指点一下让我可以按标准格式输出。 from math import sqrt def prime_judge(n): """素数判定""" sign=True for i in range(2,int(sqrt(n)+1)): if(n%i==0): sign=False return sign def Decomposition_prime_factor(n): if prime_judge(n): print(int(n)) else: for i in range(2,int(n/2)+1): if n%i == 0 and prime_judge(i): if i == int(n / 2): print(i) else: print(str(i)+"*",end='') return f(n/i) Decomposition_prime_factor(2018) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 题目15:条件嵌套 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 程序分析:嵌套就是条件里面还有条件。 score=int(input("学习成绩:")) if score>=60: if score>=90: print("A") else: print("B") else: print("C") 1 2 3 4 5 6 7 8 题目16:指定格式日期 题目:输出指定格式的日期。 程序分析:使用 datetime 模块。 import datetime if __name__=='__main__': #输出今日日期 print(datetime.date.today().strftime('%d/%m/%Y')) #创建日期对象 BirthDate=datetime.date(1999,12,12) print(BirthDate.strftime('%d/%m/%Y')) #日期算数运算 BirthNextDay=BirthDate+datetime.timedelta(days=1) print(BirthNextDay.strftime('%d/%m/%Y')) #日期替换 FirstBirthday=BirthDate.replace(year=BirthDate.year+1) print(FirstBirthday.strftime('%d/%m/%Y')) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 题目17:统计各类字符个数 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 程序分析:掌握判断各类字符的函数。 s=input("Please in put a string:") l_alpha=0 l_space=0 l_digit=0 l_others=0 for i in s: if i.isalpha(): l_alpha+=1 elif i.isspace(): l_space+=1 elif i.isdigit(): l_digit+=1 else: l_others+=1 print('char='+str(l_alpha)+ ' space='+str(l_space)+ ' digit='+str(l_digit)+ ' others'+str(l_others)) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 题目18:重复数相加 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。 程序分析:一个循环算出每一项的值,再一个循环把所有值相加。 def almost_the_same_add(a,n): if n==0 or a<=0: print(0) else: total = 0 while(n>0): for i in range(n): total=total+a*10**i n-=1 print(total) almost_the_same_add(5,3) 1 2 3 4 5 6 7 8 9 10 11 题目19:完数 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。 def wan_number(n): if n<2: return False total=0 for i in range(1,int(n/2)+1): if n%i==0: total+=i if n==total: return True else: return False wanshu=[] for j in range(2,1001): if wan_number(j): wanshu.append(j) print(wanshu) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 题目20:球的下落 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? height=100 ODOmeter=0 for i in range(10): ODOmeter+=height*1.5 if i == 9: height_10=height*0.5 ODOmeter=ODOmeter-height_10 height/=2 print("The distance that the ball traveled after falling from 100 meters is:"+str(ODOmeter)+" meters") print("The height if the tenth bounce:"+str(height_10)+" meters") 1 2 3 4 5 6 7 8 9 10 11 程序分析:我们把球从最高点下落至地面,又弹起至静止状态这个过程设置为一个段,题目要求至第十次落地时的总路程,则是共10个段的路程再减去最后一次弹起的高度即可。 题目21:猴子偷桃 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 程序分析:采取逆向思维的方法,从后往前推断 peach=1 for i in range(9): peach=(peach+1)*2 print(peach) 1 2 3 4 方法二:采取爆破 pp=1 while(True): peach=pp for i in range(9): peach=peach/2-1 if peach==1: break else: pp+=1 print(pp) 1 2 3 4 5 6 7 8 9 10 题目22:比赛名单 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 程序分析:把a,b,c与x,y,z的ASCII码值进行匹配。 for a in range(ord('x'),ord('z')+1): for b in range(ord('x'),ord('z')+1): for c in range(ord('x'), ord('z') + 1): if (a!=b)and(a!=c)and(b!=c): #以上保证a,b,c跟不同的人比赛 if a!=ord('x') and c!=ord('x') and c!=ord('z'): print('a:' + chr(a)) print('b:' + chr(b)) print('c:' + chr(c)) 1 2 3 4 5 6 7 8 9 题目23:打印图形 题目:打印出如下图案(菱形) 程序分析:将其整体规律分成上下两个部分,其中每一行打印时分成打印空格和字符*,用两重循环完成。 try: rows = int(input("Input a number:")) for i in range(int((rows+1)/2)): u=int((rows+1)/2)-1-i for j in range(u): print(' ',end='') for k in range(rows-2*u): if k!=rows-2*u-1: print('*', end='') else: print('*') for i in range(int((rows-1)/2)): d=i+1 for j in range(d): print(' ',end='') for k in range(rows-2*d): if k!=rows-2*d-1: print('*', end='') else: print('*') except Exception as e: print("Input error") 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 方法二:网上看到一些师傅用函数轻松完成,学习了。 rows=int(input("Input a number:")) s = '*' for i in range(1, rows + 1, 2): print((s * i).center(rows)) for i in reversed(range(1, rows - 1, 2)): print((s * i).center(rows)) 1 2 3 4 5 6 题目24:分数序列 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 程序分析:请抓住分子与分母的变化规律。 def f(n): a=2.0 b=1.0 total=0 for i in range(1,n+1): total+=a/b a,b=a+b,a print(total) f(20) 1 2 3 4 5 6 7 8 9 题目25:累乘相加 题目:求1+2!+3!+...+20!的和。 程序分析:此程序只是把累加变成了累乘。 s=1 total=0 for i in range(1,21): s*=i total+=s print(total) 1 2 3 4 5 6 方法二:使用map函数。(第一个参数接收一个函数名,第二个参数接收一个可迭代对象) def f(n): s=1 for i in range(1,n+1): s*=i return s total=sum(map(f,range(1,21))) print(total) 1 2 3 4 5 6 7 题目26:简单递归 题目:利用递归方法求5! 程序分析:递归公式:fn=fn_1*4! def f(n): if n==0: sum=1 else: sum = n * f(n - 1) return sum print(f(5)) 1 2 3 4 5 6 7 题目27:简单递归2 题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 def f(s,l): if l==0: return else: print(s[l-1],end='') f(s,l-1) s=input("Input a string:") l=len(s) f(s,l) 1 2 3 4 5 6 7 8 9 题目28:简单递归3 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大? 程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。 def f(n): if n==1: age=10 else: age=f(n-1)+2 return age print(f(5)) 1 2 3 4 5 6 7 题目29:分解每一位数 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 程序分析:学会分解出每一位数。 x=int(input("Input a number:")) a=x//10000 b=x%10000//1000 c=x%1000//100 d=x%100//10 e=x%10 if a!=0: print('五位数:'+str(e)+str(d)+str(c)+str(b)+str(a)) elif b!=0: print('四位数:'+str(e)+str(d)+str(c)+str(b)) elif c!=0: print('三位数:'+str(e)+str(d)+str(c)) elif d!=0: print('二位数:'+str(e)+str(d)) else: print('个位数:'+str(e)) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 题目30:回文数判断 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 程序分析:可以参考29题,将每一位分解出来进行比较。也可以用字符处理方法处理。 x=input("Please input a number") s=str(x) sign=True for i in range(int(len(s)/2)): if s[i]!=s[-1-i]: sign=False break if sign: print("It is a palindrome.") else: print("It isn't a palindrome.") 1 2 3 4 5 6 7 8 9 10 11 题目31:首字母判断 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。 程序分析:才发现Python没有switch case语句,但可以用字典,值执行方法来代替。 def T(): t=input("The follow alphabet:") if t=='u': print('Tuesday') elif t=='h': print('Thursday') def S(): s=input("The follow alphabet:") if s=='a': print('Saturday') elif s=='u': print('Sunday') switch={ 'M':lambda:print('Monday'), 'W':lambda:print('Wednesday'), 'F':lambda:print('Friday'), 'T':lambda:T(), 'S':lambda:S() } letter=input("Please input:") switch[letter]() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 题目32:反向输出列表 题目:按相反的顺序输出列表的值。 list=['a','b','c','d'] for i in list[::-1]: print(i) 1 2 3 题目33:连接字符 题目:按逗号分隔列表。 程序分析:join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。 str=',' seq=['a','b','c','d'] print(str.join(seq)) 1 2 3 题目34:函数调用练习 题目:练习函数调用。 程序分析:恭喜恭喜。 def hello_world(): print('hello world!') def there_hellos(): for i in range(3): hello_world() there_hellos() 1 2 3 4 5 6 题目35:文本颜色设置 题目:文本颜色设置。 程序分析:终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。转义序列是以ESC开头,即用 33来完成(ESC的ASCII码用十进制表示是27,用八进制表示就是033) 书写格式:开头部分:033[显示方式;前景色;背景色m + 结尾部分: 33[0m class bcolors: HEADER = '