目录
前言
今天开始打卡的第一天,希望能够一直坚持下去。
因为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')
python练习实例16
题目:
输出指定格式的日期。
分析:
datetime包与time用法基本一样。采用strftime方法格式化输出时间。
源代码:
import datetime
x = datetime.datetime.now()
print(x.strftime("%Y-%m-%d"))
print(x.strftime("%Y-%m-%d %A %H:%M:%S"))
python练习实例17
题目:
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
分析:
通过比较计数。其中英文字母的大小写要分开用or连接。
源代码:
x = input('请输入一行字符:')
empty = 0
english = 0
number = 0
other = 0
for i in x:
if 'a' <= i <= 'z' or 'A' <= i <= 'Z':
english += 1
elif i == ' ':
empty += 1
elif '0' <= i <= '9':
number += 1
else:
other += 1
print(f'empty={empty}\nenglish={english}\nnumber={number}\nother={other}')
python练习实例18
题目:
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
分析:
需要有一个b在每次循环中自乘10加a,作为a,aa,aaa,aaaa等,然后s求和。
源代码:
a = int(input('请输入a值:'))
n = int(input('请输入n值:'))
s = a
b = a
for i in range(n-1):
b = b * 10 + a
s += b
print(s)
python练习实例19
题目:
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
分析:
这次是找因子,并非质因数。
所以找到一个就加进去。
Tip:为了避免重复因子的影响,我们选择用集合。后面可以强制转换列表来索引。
源代码:
for i in range(4, 1001):
x = {1}
for j in range(2, i):
a = i / j
if a % 1 == 0:
x.add(int(a))
x.add(j)
s = 0
x = list(x)
for k in x:
s += k
if i == s:
print(i, end="=")
print(x[0], end='')
for m in range(1, len(x)):
print(f'+{x[m]}', end='')
print('')
python练习实例20
题目:
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
分析:
只要理清节点就很简单。
源代码:
h = 100
s = 100
for i in range(10):
s += h
h /= 2
print(f's={s}')
print(f'h={h}')
python练习实例21
题目:
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
分析:
简单的逆向思维问题。
源代码:
x = 1
for i in range(9):
x = (x+1)*2
print(x)
python练习实例22
题目:
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
源代码:
team = ['x', 'y', 'z']
for i in team:
for j in team:
if i != j:
for k in team:
if i != k and j != k:
if i != 'x' and k != 'x' and k != 'z':
print(f'a--{i}\nb--{j}\nc--{k}')
python练习实例23
题目:
打印出如下图案(菱形):
* *** ***** ******* ***** *** *
分析:
找出i与空格、‘*’的对应数学关系,循环输出。
源代码:
empty = ' '
for i in range(7):
if i < 4:
print(empty*(3-i)+'*'*(2*i+1))
else:
print(empty*(i-3)+'*'*(2*(7-i)-1))
python练习实例24
题目:
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
分析:
我们又看到了熟悉的东西:斐波那契数列。
于是我们再次找到实例6的代码,稍作修改加以引用。
源代码:
a, b = 1, 2
list1 = [1, 2]
n = 21
for i in range(n-2):
a, b = b, a+b
list1.append(b)
s = 0
for i in range(len(list1)-1):
s = s + list1[i+1]/list1[i]
print(s)
python练习实例25
题目:
求1+2!+3!+...+20!的和。
分析:
循环相乘求和。
源代码:
a = 1
s = 0
for i in range(1, 21):
a *= i
s += a
print(s)
python练习实例26
题目:
利用递归方法求5!。
分析:
因为需要用递归解决问题,所以我们需要定义一个函数来实现递归算法,其中的传递参数为n。
源代码:
def n_1(n):
if n == 0 or n == 1:
return 1
else:
return n * n_1(n - 1)
print(n_1(5))
python练习实例27
题目:
利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
分析:
这个题目还是递归,但是需要传递两个参数来控制递归。一个是字符串str1,一个是需要用到的字符串索引数n。
源代码:
def invert(n, str1):
if n == 0:
return
print(str1[n - 1], end="")
invert(n - 1, str1)
str1 = input('请输入字符串:')
n = len(str1)
invert(n, str1)
python练习实例28
题目:
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
分析:
读题发现是很简单的一道题,但是蕴含了递归的思想,于是我们用递归算法来解决这个问题。
源代码:
def age(n):
if n == 1:
return 10
else:
return age(n-1)+2
print(age(5))
python练习实例29
题目:
给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
分析:
因为给定了不多于5位的正整数是,因此我们可以直接用5次的for循环,只需要给定一个结束循环并打印的条件就行。
源代码:
number = int(input('请输入一个不多于五位的正整数:'))
for i in range(5):
n = number % 10
number = int((number - n) / 10)
print(n)
if number == 0:
print(f'这是一个{i+1}位数')
break
python练习实例30
题目:
一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
分析:
if判断语句
源代码:
n = int(input('请输入一个5位数:'))
a = n // 10000
b = (n - a * 10000) // 1000
d = n % 10
c = (n % 100 - d) // 10
if a == d and b == c:
print('是回文数!')
else:
print('不是回文数')
python练习实例31
题目:
请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
分析:
我的思路是:创建一个可索引的列表week,将七个单词以列表的形式储存到week中,以便后面的索引。
这样,我们就可以用for循环来解决问题。
最后输出时,要想得到连续的字母,需要用到''.join()语句。
源代码:
week = [list('Monday'), list('Tuesday'), list('Wednesday'), list('Thursday'), list('Friday'), list('Saturday'), list('Sunday')]
first_letter = str(input('请输入第一个字母:'))
n = 0
a = 0
for i in range(7):
if first_letter == week[i][0]:
a = i
n += 1
if n == 1:
print(''.join(week[a]))
elif n == 2:
second_letter = str(input('请输入第二个字母:'))
for i in range(7):
if second_letter == week[i][1]:
print(''.join(week[i]))
else:
print('error')
python练习实例32
题目:
按相反的顺序输出列表的值。
源代码:
list1 = [1, 2, 3, 4, 5, 6]
list2 = list1[::-1]
print(list2)