题目链接
from operator import add, sub
def a_plus_abs_b(a, b):
"""在不使用abs()函数的前提下,返回a + abs(b)的和"""
if b < 0:
f = sub
else:
f = add
return f(a, b)
def two_of_three(a, b, c):
"""
返回a, b, c中最大2个数的平方和
假设a, b, c为正数
"""
# 方法一
# return max(a*a + b*b, a*a + c*c, b*b + c*c)
# 方法二
return a*a + b*b + c*c - (min(a, b, c))**2
def largest_factor(n):
"""
求n的最大公约数
利用枚举法,从n-1开始,第一个符合条件的即为最大公约数。
如果n除以factor余数为0,说明factor为n的最大公约数,否则factor-1继续循环
"""
factor = n - 1
while True:
if n % factor == 0:
return factor
else:
factor -= 1
本题的用意在于区别with_if_statement()和with_if_function()执行的结果
if_statement()只有在满足该条件的时候,才会检查该分支是否有误
而if_function()在执行的时候,就会检查各个参数是否有误
所以在极端的情况下with_if_statement()会返回1
而with_if_function()会出现ZeroDivisionError: division by zero
def c():
return False
def t():
return 1 / 0
def f():
return 1
def hailstone(n):
"""
初始化长度为1,因为如果n=1, 则不进入循环直接打印n,返回length
在while循环里,根据定义对满足条件的n进行处理
"""
length = 1
while n != 1:
print(n)
if n % 2 == 0:
n = n // 2 # 得到整数n
else:
n = n*3 + 1
length += 1
print(n)
return length
def multiple(a, b):
"""
求a,b的最小公倍数(lowest common multiple)
思路和求最大公约数差不多,最小公倍数除以被除数,余数为0
利用枚举法,先从a,b两个数中选出大的那个数作为初始的lcm,
每次循环lcm加上1,满足条件则return lcm
"""
if a > b:
lcm = a
else:
lcm = b
while True:
if lcm % a == 0 and lcm % b == 0:
return lcm
else:
lcm += 1
def unique_digits(n):
"""
返回正整数n里不重复的数字的个数
先把n的类型从不可迭代的int转换为可迭代的str,
利用set的特性去除重复的元素,最后返回set集合的长度
"""
return len(set(str(n)))