CS61A——Labs(更新至Lab-01)

Lab-00

Lab-01

Falling Factorial

题目

写一个falling函数,输入是nk,要求返回k个连续的值的乘积,这几个值从n开始往下递减,当k为0的时候,返回1。

1
2
3
4
5
6
7
8
9
10
11
12
13
def falling(n, k):
"""Compute the falling factorial of n to depth k.

>>> falling(6, 3) # 6 * 5 * 4
120
>>> falling(4, 3) # 4 * 3 * 2
24
>>> falling(4, 1) # 4
4
>>> falling(4, 0)
1
"""
"*** YOUR CODE HERE ***"

分析

很简单,先判断k为零的情况,然后用循环计算乘积。

解答

1
2
3
4
5
6
7
8
9
10
def falling(n, k):
if k == 0:
return 1
else:
prod = 1
while k > 0:
prod *= n
n -= 1
k -= 1
return prod

Sum Digits

题目

写一个函数,接受非负整数为输入,对它的各个位数求和。(提示可能需要使用整除和模运算)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def sum_digits(y):
"""Sum all the digits of y.

>>> sum_digits(10) # 1 + 0 = 1
1
>>> sum_digits(4224) # 4 + 2 + 2 + 4 = 12
12
>>> sum_digits(1234567890)
45
>>> a = sum_digits(123) # make sure that you are using return rather than print
>>> a
6
"""
"*** YOUR CODE HERE ***"

分析

要把每一位数提取出来,n % 10可以得到个位数,n // 10可以得到其他位数,也很简单。

解答

1
2
3
4
5
6
def sum_digits(y):
ans = 0
while y != 0:
ans += y % 10
y //= 10
return ans

Double Eights

写一个函数,输入是一个数,判断它的数字里面有没有两个相邻的8。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def double_eights(n):
"""Return true if n has two eights in a row.
>>> double_eights(8)
False
>>> double_eights(88)
True
>>> double_eights(2882)
True
>>> double_eights(880088)
True
>>> double_eights(12345)
False
>>> double_eights(80808080)
False
"""
"*** YOUR CODE HERE ***"

分析

就判断低两位是不是88,如果不是就整除10来右移,直到碰到88或位数不够2。

解答

1
2
3
4
5
6
def double_eights(n):
while n >= 88:
if n % 100 == 88:
return True
n //= 10
return False

这里while n >= 88也可以是while n >= 0,在判断的时候会更快,但可能会多计算两轮。