目录
前言
今天开始打卡的第一天,希望能够一直坚持下去。
因为python这东西,只看不练是没什么效果的。所以我就先稍微复习了一些川川的教程,然后开始今天的案例。
python练习实例1
题目:
有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
分析:
直接三重循环暴力遍历,计数并输出,比较简单。
源代码:
n = 0
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
if i != j and j != k and i != k:
n += 1
print(i, j, k)
print(n)
python练习实例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,求应发放奖金总数?
分析:
最直接的方法是多重if条件语句直接计算,但是我觉得这样没有意义,所以想了以下方法。
思路是用列表的索引来循环计算每部分利润并求和。
具体实现:
将节点临界值(10w、20w等)赋值一个列表rim,提成作为权值赋值给另一个列表p。比较输入I与rim列表的值大小,以此分割计算区域。索引rim[i-1]及以前临界值差与权值乘积求和,I-索引rim[i]的值与对应权值乘积并求和。实现利润计算。
第一次写,思路还是有些写不明白,见谅。
源代码:
I = int(input("请输入利润I(万元):"))
rim = [0, 10, 20, 40, 60, 100]
p = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]
s = 0
for i in range(5, -1, -1):
if I > rim[i]:
for j in range(i):
s += p[j] * (rim[j + 1] - rim[j])
s += p[i] * (I - rim[i])
break
print('%.2f万元' % s)
注意:
这个代码中比较重要的一点是 j循环下的break语句。
因为是从大到小比较,所以I大于大的值,肯定也大于更小的值,如果不加break语句,就会继续循环导致计算出错。
就好像你需要算1+2+3的值,但不加break的话算的就是1+(1+2)+(1+2+3)的值。
python练习实例3
题目:
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
分析:
这道题需要用数学知识把题目的已知条件做些转化,以便能够用python编程实现求解。
因为我也没想出来什么方法,所以在此借用菜鸟的分析:
假设该数为 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(x)
收获:
编程往往需要运用数学知识对问题已知条件做合适的转化,来达到简单编程的目标。需要加强这方面的学习和应用。
python练习实例4
题目:
输入某年某月某日,判断这一天是这一年的第几天?
分析:
首先要知道闰年这个概念:
普通闰年:能被4整除但不能被100整除
世纪闰年:能被400整除
当判断是闰年的时候,月份为3以上时天数要+1
源代码:
year = int(input('请输入年份:'))
month = int(input('请输入月份:'))
day = int(input('请输入日:'))
s = 0
days = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
if ((year % 4 == 0 and year % 100 != 0) or year % 400 == 0) and month > 2:
s = days[month - 1] + day + 1
else:
s = days[month - 1] + day
print('这是一年的第%d天' % s)
python练习实例5
题目:
输入三个整数x,y,z,请把这三个数由小到大输出。
分析:
三个数,算是一个小型冒泡排序。
源代码:
x = int(input('first number:'))
y = int(input('second number:'))
z = int(input('third number:'))
if x > y:
x, y = y, x
if y > z:
y, z = z, y
if x > y:
x, y = y, x
print(x, y, z)
python练习实例6
题目:
斐波那契数列
分析:
用一个python特有的多元赋值语句解决,比较简单。
源代码:
a, b = 0, 1
list1 = [0, 1]
n = int(input('请输入n(n>2):'))
for i in range(n-2):
a, b = b, a+b
list1.append(b)
print(list1)
python练习实例7
题目:
将一个列表的数据复制到另一个列表中。
源代码:
a = [1, 23, 45, 265, 7]
b = a.copy()
print(b)
python练习实例8
题目:
输出 9*9 乘法口诀表。
分析:
用python的格式化输出print完成。
‘-’表示左对齐,‘.’前面的数字表示占位数,后面表示小数点保留位数。
源代码:
for i in range(1, 10):
for j in range(1, i+1):
print('%dx%d=%-4d' % (i, j, i * j), end='')
print('')
python练习实例9
题目:
暂停一秒输出。
分析:
利用time包的sleep暂停。
源代码:
import time
num = [1, 2, 3, 4, 5, 6]
for i in range(len(num)):
print(num[i])
time.sleep(1)
python练习实例10
题目:
暂停一秒输出,并格式化当前时间。
分析:
用time包的格式化时间。
time.strftime(format, t)
- %y 两位数的年份表示(00-99)
- %Y 四位数的年份表示(000-9999)
- %m 月份(01-12)
- %d 月内中的一天(0-31)
- %H 24小时制小时数(0-23)
- %I 12小时制小时数(01-12)
- %M 分钟数(00-59)
- %S 秒(00-59)
- %a 本地简化星期名称
- %A 本地完整星期名称
- %b 本地简化的月份名称
- %B 本地完整的月份名称
- %c 本地相应的日期表示和时间表示
- %j 年内的一天(001-366)
- %p 本地A.M.或P.M.的等价符
- %U 一年中的星期数(00-53)星期天为星期的开始
- %w 星期(0-6),星期天为星期的开始
- %W 一年中的星期数(00-53)星期一为星期的开始
- %x 本地相应的日期表示
- %X 本地相应的时间表示
- %Z 当前时区的名称
- %% %号本身
源代码:
import time
print(time.strftime('%Y-%m-%d %H:%M:%S'))
time.sleep(1)
print(time.strftime('%Y-%m-%d %H:%M:%S'))
python练习实例11
题目:
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
分析:
1,1,2,3,5,8……
可见,这是斐波那契数列。我记得最早了解斐波那契数列的引例就是这个。
因此,让我们拿出python练习实例6来稍作修改,去掉第一个0。
源代码:
a, b = 1, 1
list1 = [1, 1]
n = int(input('请输入月份n(n>2):'))
for i in range(n-2):
a, b = b, a+b
list1.append(b)
print(list1)
python练习实例12
题目:
判断101-200之间有多少个素数,并输出所有素数。
分析:
用这个数分别除以2到它本身-1,都不能整除则为素数。
为了减少计算量,可以排除偶数,只遍历奇数。
源代码:
n = 0
for i in range(101, 201, 2):
k = 0
for j in range(2, i):
if i % j != 0:
k += 1
if k == i-2:
n += 1
print(i)
print(f'101-200内素数的个数为{n}个')
python练习实例13
题目:
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
分析:
重点是如何取出每一位数。我的方法是:
百位通过整除100取出,
十位先取余100再整除10,
个位取余10.。
但是我做的时候竟然把三次方输成了二次方,我说怎么一个结果也没有。
看清题目很重要。。。
源代码:
for i in range(100, 1000):
x = i // 100
y = (i % 100) // 10
z = i % 10
if i == x ** 3 + y ** 3 + z ** 3:
print(i)
python练习实例14
题目:
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
分析:
这道题做了很久,说明基础还是不太扎实。
这道题有几个重要的点:
一是要让每次判断n能被整除时更新n的值
n = n / i
二是要更新n值后让for i循环重新开始(为了能让重复的质因数出现)
参考示例,将for循环置于while n not in [1]循环下,每次n更新并输出i后break一下,否则continue
三是最后的输出问题,需要一个停止(不能一直输出2*2*这样的,没有结尾)
判断最后的n==1则不输出*
源代码:
n = int(input('请输入需要分解的正整数:'))
print(f'{n}=', end='')
while n not in [1]:
for i in range(2, int(n)+1):
n /= i
if n == 1:
print(f'{i}', end='')
break
elif n % 1 == 0:
print(f'{i}', end='*')
break
else:
n = int(n*i)
continue
收获:
break和continue语句应该熟练掌握,考虑问题时要知道循环应该从哪里结束或者继续。
python练习实例15
题目:
利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
分析:
很简单,很基础。
注意python里是elif,不是else if。
源代码:
while 1:
score = int(input('请输入学习成绩(百分制):'))
if score >= 90:
print('A')
elif score >= 60:
print('B')
else:
print('C')