将给定自然数的所有位相加直到数字最后只剩一位。

16 => 1 + 6 => 7;
942 => 9 + 4 + 2 => 15 => 1 + 5 => 6
132189 => 1 + 3 + 2 + 1 + 8 + 9 => 24 => 2 + 4 => 6

看了别人给出的解法:

num % 9 or n and 9

看得我一脸茫然,不知道发生了什么,在网上查找了一番理解了下这个算法。

首先假设有一个四位数为n,四位分别为a、b、c、d,则:

n % 9
= (999a + 99b + 9c + a + b + c + d) % 9
= (a + b + c + d) % 9

(a + b + c + d)得到一个数,我们使它递归到最后只剩一位数字,假设为k,则:

n % 9 = k % 9

所以数字n所有位数递归累加至一位时的结果k为:

if n % 9 == 0:
    k = 9
elif n == 0:
    k = 0
else:
    k = n % 9

回头再看别人的解法:

num % 9 or n and 9

还是一脸茫然,因为对操作符的运行顺序不明白。又去查了下:

Operation Result
x or y if x is false, then y, else x
x and y if x is false, then x, else y
not x if x is false, then True, else False

优先级关系:or < and < not,同一优先级默认从左往右计算

再回头看别人的解法,应该是这样:

num % 9 or (n and 9)

所以,这种还是多加括号,免得产生歧义,或者把我这种小白绕晕。

以下为参考链接

https://segmentfault.com/q/10...

http://blog.csdn.net/qq_28267...


对影yu
1 声望0 粉丝