question:
一个非负整数,将所有位数上的数字相加,得到一个数,如果得数不是个位数,继续相加,直到得数为个位数为止。
例入,num=38,3+8=11,1+1=2。写一段代码,计算所有数相加的得数。
answer:
初级:使用循环或递归解题。
def adddigits(num):
snum = str(num)
count = len(snum)
result = 0
for i in range(count):
result += int(snum[i])
if result >= 10:
result = adddigits(result)
else:
print result
进阶:原题中的follow up指出,不要用递归和循环解题,所以下面不用循环和递归的方式解题。
先分析。一个数,假如设为ABCD,则实际上这个数可以表达为num = A*1000+B*100+C*10+D。
可分解为num = (A+B+C+D) + (999*A+99*B+9*C),因为我们需要求的是A+B+C+D,所以我们可以采用%的方法。
因为(999*A+99*B+9*C)肯定是9的倍数,则 num % 9 = A+B+C+D,如果A+B+C+D>=10,对9取余,可依照刚才的方法继续分析,结果是一样的。
但是,当num = 9时,9 % 9 = 0,不符合题目的要求,所以算法的核心是
result = (num - 1)% 9 + 1
代码如下:
def adddigits(num):
result = (num-1) % 9 + 1
return result