CA61A(Fall 2016)-Homework 1

题目链接

Q1 在线demo

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)

Q2 在线demo

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

Q3 在线demo

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

Q4 在线demo

本题的用意在于区别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


    
  

Q5 在线demo

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

Q6 在线demo

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

Q7 在线demo

def unique_digits(n):
    """
    返回正整数n里不重复的数字的个数
    先把n的类型从不可迭代的int转换为可迭代的str,
    利用set的特性去除重复的元素,最后返回set集合的长度
    """
    return len(set(str(n)))

你可能感兴趣的:(CA61A(Fall 2016)-Homework 1)