完数
题目 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数
# 定义一个函数,用于计算一个数的所有因子
def factor(num):
# 将输入的num转换为整数
target=int(num)
# 创建一个集合,用于存储因子的结果
res=set()
# 遍历从1到num-1的所有数
for i in range(1,num):
# 如果num能被i整除
if num%i==0:
# 将i和num/i添加到结果集合中
res.add(i)
res.add(num/i)
# 返回结果集合
return res
# 遍历从2到1000的所有数
for i in range(2,1001):
# 如果i等于i的所有因子的和减去i
if i==sum(factor(i))-i:
# 打印i
print(i)
高空抛物
题目 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高
# 定义变量high为200
high=200
# 定义变量total为100
total=100
# 循环10次
for i in range(10):
# 将high除以2
high/=2
# 将high加到total上
total+=high
# 打印high除以2的结果
print(high/2)
# 打印总长
print('总长:',total)
猴子偷桃
题目 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少个桃子
peach=1
for i in range(9):
peach=(peach+1)*2
print(peach)
比赛对手
题目 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单
# 定义集合a,包含元素'x','y','z'
a=set(['x','y','z'])
# 定义集合b,包含元素'x','y','z'
b=set(['x','y','z'])
# 定义集合c,包含元素'x','y','z'
c=set(['x','y','z'])
# 从集合c中删除元素'x'和'z'
c-=set(('x','z'))
# 从集合a中删除元素'x'
a-=set('x')
# 遍历集合a中的元素
for i in a:
# 遍历集合b中的元素
for j in b:
# 遍历集合c中的元素
for k in c:
# 如果集合(i,j,k)的长度为3,则打印出a,b,c的值
if len(set((i,j,k)))==3:
print('a:%s,b:%s,c:%s'%(i,j,k))
#% (i, j, k) 将 i, j, k 的值分别插入到字符串中
画菱形
题目 画菱形
def draw(num):
# 定义一个函数,用于绘制一个倒三角形
a="*"*(2*(4-num)+1)
# 定义一个字符串,长度为2*(4-num)+1
print(a.center(9,' '))
# 打印字符串,居中,宽度为9,用空格填充
#a.center(9, ' ') 是在字符串 a 的基础上,
# 通过在两侧填充指定的字符(这里是空格 ' '),
# 使得最终的字符串长度达到9个字符
if num!=1:
# 如果num不等于1,则递归调用draw函数,num减1
draw(num-1)
# 再次打印字符串,居中,宽度为9,用空格填充
print(a.center(9,' '))
# 打印字符串,居中,宽度为9,用空格填充
draw(4)
center()实现原理
enter(width[, fillchar]) 方法的参数有两个: width:最终字符串的总长度。 fillchar(可选):用于填充的字符,默认为空格 ' ' 如果字符串的长度小于 width,则在两侧均匀地填充 fillchar,使得字符串的长度达到 width。如果字符串的长度大于或等于 width,则返回原字符串。
注意
1.fillchar 必须是一个单字符的字符串。如果传入的 fillchar 长度不为1,会抛出 TypeError 异常 2.如果 width 小于或等于字符串的长度,则原样返回字符串,不会进行填充
示例
a = "hello"
centered_a = a.center(9, ' ')
print(centered_a) # 输出:' hello '
在这个示例中,原字符串 "hello" 长度为5,而 center(9, ' ') 方法将其扩展到长度为9,两侧各填充了两个空格,使得 "hello" 居中。
center() 方法可以处理负数宽度吗?
center() 方法不能处理负数宽度。如果尝试传入一个负数作为宽度参数,Python会抛出一个 ValueError 异常。这是因为负数宽度在逻辑上没有意义,因为字符串的长度不能是负数。
示例
a = "hello"
try:
centered_a = a.center(-9, ' ')
except ValueError as e:
print(f"Error: {e}") # 输出:Error: Width must be greater than or equal to 0
在这个示例中,尝试使用负数宽度 -9 调用 center() 方法,会捕获到 ValueError 异常,并输出错误信息 "Width must be greater than or equal to 0"。
正确使用
要使用 center() 方法,请确保传入的宽度参数是一个非负整数。如果宽度参数为0或负数,可以考虑不调用 center() 方法,或者根据具体需求调整逻辑。
替代方案
如果需要根据某些条件动态调整字符串的显示,可以在调用 center() 方法前检查宽度参数,确保其为正数。例如:
a = "hello"
width = 9 # 假设这是动态计算的宽度
if width > 0:
centered_a = a.center(width, ' ')
else:
centered_a = a # 或者其他处理方式
print(centered_a)
通过这种方式,可以避免因传入负数宽度而导致的异常。
斐波那契数列II
题目 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
a = 2.0
b = 1.0
s = 0
for n in range(1,21):
s += a / b
a,b = a + b,a
print (s)
阶乘求和
题目 求1+2!+3!+…+20!的和
res=1
for i in range(20,1,-1):
#创建一个从20递减到2的循环
res=i*res+1#阶乘的累加规律
print(res)
递归求阶乘
题目 利用递归方法求5!
def factorial(n):
return n*factorial(n-1) if n>1 else 1
print(factorial(5))
这个函数等价于:
def factorial(n):
if n > 1:
return n * factorial(n-1) # 递归调用:n! = n × (n-1)!
else:
return 1 # 终止条件:1! = 1
递归输出
题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
def rec(string):
if len(string)!=1:
rec(string[1:])
print(string[0],end='')# 打印当前字符串的第一个字符
rec(input('string here:'))
string[1:] 表示截取字符串从索引 1 到末尾的子串(即去掉第一个字符)。每次递归调用时,都会将字符串 "缩短" 一部分。递归的执行顺序是 "先深入到底,再逐层返回"。整个过程类似 "剥洋葱":先一层层剥开(递归调用),再从最里面一层开始处理(打印),从而实现反向输出的效果。
递归求等差数列
题目 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
def age(n):
if n==1:
return 10
return 2+age(n-1)
print(age(5))
终止条件:当 n=1 时,直接返回 10(已知的第一项) 递归关系:对于 n>1 的情况,第 n 项的值 = 第 (n-1) 项的值 + 2