本文,是鼓励自己写知乎,并且希望和笔者一样的小白共同进步。仅此而已。
建议,和笔者一样的小白,最先挡住代码,自己看这些小项目写代码。
代码原则:只求简单便于理解。
如果更快速代码,望指出。
第一题 给任意一个的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
a = int(input('请输入任意一个的正整数:'))
count = 0
# 用while循环,直到最后的a小于1时,便计数完毕
while (a >= 1):
num_daoxu = int(a % 10)
print(num_daoxu)
a /= 10
count += 1
print('它是%d位数。'%count)
第二题 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
count = 0
num_list = []
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
# 互不相同,则要三个条件放在一个if里
if i != j and j != k and k != i:
count += 1
num_list.append(100 * i + 10 * j + k)
print(count)
print('这些数字为:', num_list)
第三题 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
# 本题应该为目前网上最简单,最迅速的方法哈(求大佬喷)
# 统计字母、空格、数字这些东西,能迅速把他们进行分类的,只有正则表达式
# 正则表达式挑选符合要求的数字,以后爬虫也会经常遇到,就当练手
import re
a = str(input('请输入一串字符:'))
# 注意不要忽略了引号
# re.compile()编译正则表达式,生成正则表达式对象
zimu = re.compile('[a-zA-Z]')
kongge = re.compile(r'\s')
shuzi = re.compile(r'\d')
# findall()函数可以找到任何满足正则表达式条件的内容,并生成一个列表
count_shuzi = len(shuzi.findall(a))
count_zimu = len(zimu.findall(a))
count_kongge = len(kongge.findall(a))
count_qita = len(a) - count_kongge - count_zimu - count_shuzi
print('英文字母个数为:%d'%count_zimu)
print('空格个数为:%d'%count_kongge)
print('数字个数为:%d'%count_shuzi)
print('其他个数为:%d'%count_qita)
第四题 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
# 虽然此题可以一眼看出结果,但是从编程角度笔者想不出更简洁的编程方法
# 这道题用到很多重新赋值,以及列表删除方法
# 首先注意a不能直接赋值
team_jia = [str('a'), str('b'), str('c')]
# 第一个循环确定a和谁比赛,
for i in range(0, 3):
team_yi = [str('x'), str('y'), str('z')]
match_list = []
selected_first_yi = team_yi.pop(i)
if selected_first_yi != 'x':
# 第二个循环,产生接下来的两场比赛
for j in range(0, 2):
# 由于后面又用到了list.pop(),因此要重新赋值
team_yi = [str('x'), str('y'), str('z')]
team_yi.remove(selected_first_yi)
# 重新赋值
match_list = [tuple([team_jia[0], selected_first_yi])]
match_list.append(tuple([team_jia[1], team_yi.pop(j)]))
# 两次pop()后,team_yi只剩下一个值
match_list.append(tuple([team_jia[2], team_yi[0]]))
if ('c', 'x') not in match_list and ('c', 'z') not in match_list :
print('比赛顺序为:', match_list, '.')
第五题 企业发放的奖金根据利润提成。利润(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 = int(input('输入你的利润:'))
# input()函数再加上int()其实是让输入的结果看作一个值
num_jine = [1000000, 600000, 400000, 200000, 100000, 0]
rat = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]
all_jiangjin = 0
# 从0开始,累加的思想
# 分段利率,则可以从大到小计算,分段思想:i-arr[idx]
# 因此索引也要从大到小排列
# 注意累加 用r +=
for y in range(0, 6):
if i > num_jine[y]:
all_jiangjin += (i - num_jine[y]) * rat[y]
# 将大于num_jine的部分奖金已算出,故可以赋值,求更小的那个奖金段
i = num_jine[y]
print(all_jiangjin)
第六题 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
import math
x = 1
while True:
if math.sqrt(x+100) - int(math.sqrt(x+100)) == 0 and math.sqrt(x+168) - int(math.sqrt(x+168)) == 0:
print(x)
# 只求一个整数,则要在找到这个整数的时候,加入一个break,表示退出循环
break
# 如果不满足条件,x+1进行继续循环判断
x += 1
第七题 输入某年某日 判断你这是第几天?
# 此题应该是网上最容易理解的版本
import datetime
input_year = int(input('year:'))
input_month = int(input('month:'))
input_day = int(input('day:'))
# 这里要用到int()函数,确保是整数
# 下面的调用,是最简单的求时间差异的方法
time1 = datetime.datetime(input_year, input_month, input_day)
time2 = datetime.datetime(input_year, 1, 1)
days = (time1-time2).days
print('这是第%d天。'%days)
第八题 输入三个整数x,y,z,请把这三个数的最大值。
a = float(input('x:'))
b = float(input('y:'))
c = float(input('z:'))
if a >= max(b, c):
print(a)
elif b >= max(a, c):
print(b)
else:
print(c)
第九题 输出9*9口诀表,注意输出形式为直角三角形。
for i in range(1, 10):
for j in range(1, 10):
if i >= j:
print(j, "*", i, "=", i*j, end=' ')
# 下一行代码代表着内置循环结束以后,在输出一个’‘,其实这是什么都没有的,只是没有end=’‘,所以就自动换行了
print('')
第十题 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少?
# 先列出来思考的顺序:
# 第一天,兔子对数1
# 第二天,兔子对数1
# 第三天,兔子对数2 构成:成年1;出生1
# 第四天,兔子对数3 构成:成年1;幼年1;出生1
# 第五天,兔子对数5 构成:成年2;幼年1;出生2
# 根据对应情况,可以认为第五天的情况是第三四天的汇总
# 因此构成斐波那契数列。
a = 1
b = 1
for i in range(3, 100):
a, b = b, a+b
print('第%d个月兔子总对数为%d'%(i,b))
第十一题 判断101-200之间有多少个素数,并输出所有素数。
import math
count = 0
for i in range(101, 201):
# 因为下文涉及到了,循环+判断,所以必须要引入一个值来记录:所有循环满足条件?还是部分符合条件?
# a的值可以看作标记。
a = 0
for j in range(2, int(math.sqrt(i)+1)):
if i % j == 0:
a = 1
# 在一个i值下,循环了j值。如果依旧a==0,就说明满足条件素数条件
if a == 0:
count += 1
print(i)
print('一共有'+str(count)+'个。')
第十二题 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
# 第一种方法 显而易见用循环的方法,再利用取整
for a in range(100, 1000):
b = a//100
c = (a - 100*b)//10
d = a - 100*b-10*c
if a == b**3 + c**3 + d**3:
print(a)
# 第二种方法 笔者为了复习一下while True函数,用这个函数改了一下
# 注意,while True结构一定要break,否则循环一直循环下去
a = 100
while True:
b = a//100
c = (a - 100*b)//10
d = a - 100*b-10*c
if a == b**3 + c**3 + d**3:
print(a)
a = a + 1
if a > 999:
break
第十二题 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
a = int(input('您要将哪个数分解为质因数相乘的形式:'))
print(a, '=', end=' ')
while (a != 1):
# 注意对除数的循环要从2开始,从1开始会陷入死循环
for i in range(2, int(a+1)):
if a % i == 0:
# 这个地方很重要,提取完a的最小后的现值,再赋予a,这个时候就需要/=
a /= i
if a == 1:
print(i, end=' ')
else:
print(i, '*', end=' ')
# 最深层次的if循环语句是为了打印输出结果
# 但是,我们还要在这个现值a上重新开始for循环,而不是继续开始for循环
# 这时候,就可以使用break跳出for循环,去验证while条件句
# 如果不是最简,则重新开始for循环,并使用新的a值
break
第十三题 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
your_grade = int(input('你的学习成绩为:'))
# 由于是三个条件,所以要用到:条件 and 输出 or...注意这是个非主流的方法
mark = your_grade >= 90 and 'A' or your_grade >= 60 and 'B' or 'C'
print('你的成绩类型是%s.'%mark)
第十四题 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字,有几个数相加由自己来控制。例如输出:2+22+222+2222+22222(此时共有5个数相加)并求值。
# 此题的关键是借助两个循环,一个大循环产生加数式,一个小循环产生每个加数
a = int(input('输入你的a值:'))
b = int(input('你想让几个数相加:'))
s = 0
print('s=', end=' ')
# 开始循环每个加数
for i in range(0, b):
# 初始化d值
d = 0
# 实现每个加数
for y in range(0, i+1):
c = a*10**y
d += c
# 设置输出的格式
if d < 10**(b - 1):
print(d, '+', end=' ')
else:
print(d, end='')
s += d
print(' =', s)
第十五题 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。
# 首先,先设置1000以内的数循环
for wanshu in range(2, 1001):
a = 0
# 建立列表,保存因子
yinzi = []
i = wanshu
# 设置内循环,找出所有因子(前面题目有详细解释)
while (i != 1):
for y in range(2, int(i+1)):
if i % y == 0:
i /= y
yinzi.append(y)
break
# 求出列表里所有数的和
for z in range(0, len(yinzi)):
a += yinzi[z]
# 不要忘记1
if (a+1) == wanshu:
print(wanshu)
第十六题 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
s = 100
h = 50
distance = 0
for i in range(0, 10):
distance += (s + h) * 0.5 ** i
print('经过的路程为%f米。'%distance)
high = s * 0.5 ** 10
print('第十次反弹的高度为%f米。'%high)
第十七题 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?
# 从第十天倒退开始算
num_taozi = 1
for i in range(1, 10):
num_taozi = (num_taozi + 1) * 2
print('桃子总个数为%d个。'%num_taozi)
第十八题 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
# 一个数的分子是前一个数分子和分母之和
# 并且,这个数的分母是前一个数的分子
# 其中,用到到斐波那契数列的构造思想
a = 2
b = 1
s = 0
for i in range(0, 20):
s += a/b
# 其中,用到到斐波那契数列数列的构造思想
a, b = a + b, a
print(s)
第十九题 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?(用递归算法)
# 笔者在看算法,这道题可以说是递归算法一个最简答的例子吧
def age(i):
if i == 1:
return 10
# 最后的return 返回函数本身,实现递归
return age(i-1)+2
print('第五个人的年龄为%d。'%age(5))
第二十题 对10个随机个位数进行排序(从小到大)。
# 笔者最后拿这个题目镇文章哈
# 第一种方法,利用循环
# 首先,利用random生成十个随机数
import random
list_num = [random.randint(0, 10) for i in range(0, 10)]
print('需要排列的数据列表为', list_num, '。')
# 建立空列表存储排列好的值
sorted_list_num = []
# 加入一个数,作为基数,和其他几个数比较
sorted_list_num.append(list_num[0])
for i in range(1, 10):
a = i
for m in range(i, 0, -1):
# 如果要加入的数大于前一个数,则将其放在该数后面
if list_num[a] > sorted_list_num[(m - 1)]:
sorted_list_num.insert(m, list_num[a])
break
# 如果小于的话,重新循环
else:
# 若是最小数的话,则放在首位
if m == 1:
sorted_list_num.insert(0, list_num[a])
break
print('排好的序列为:', sorted_list_num, '。')
#第二种方法 和第一种方法大同小异,只不过是笔者想联系函数的思想
import random
list_num = [random.randint(0, 10) for i in range(0, 10)]
print('需要排列的数据列表为', list_num, '。')
sorted_list_num = []
sorted_list_num.append(list_num[0])
def sort_method(i):
a = i
# global 定义全局变量很重要
global sorted_list_num
for m in range(i, 0, -1):
if list_num[a] > sorted_list_num[(m - 1)]:
sorted_list_num.insert(m, list_num[a])
# return 返回函数,表明函数结束
return
else:
if m == 1:
sorted_list_num.insert(0, list_num[a])
# return 返回函数,表明函数结束
return
for i in range(1, 10):
sort_method(i)
print('排好的序列为:', sorted_list_num, '。')
笔者,入门三四个月,以前没有任何语言基础。
入门之后,一直抄书打各个方向的代码。这是第一次独立完成的。
以上代码基本上都是笔者自己的思路。
点赞,给我继续写项目详解的动力哟~