leetcode 258 Add Digits
题目翻译:
给出一个非负整数num,不断地把它所有数字相加,直到最后剩下一个数字。
例如:num=38,计算过程如,3+8=11,1+1=2,所以2就是最后的数字,返回它就可以了。
并且,你能不使用任何循环或者递归,在O(1)的复杂度内完成吗?
解题思路:
时间复杂度规定了在O(1)内完成,不能采用循环或者递归,那么就变成了数学的问题了,必须找到一个类似方程式的函数,带入即可求解。然后,偶然发现对于9的倍数的一个规律:18,27,36,...,81等数字相加都是9,而且扩展到三四位数,如549,最后也得到9。这个规律的证明之后送上,这里我们可以利用这个规律,num若为9的倍数,则可以判定结果为9。对于9n+1,...,9n+8的情况,我们可以这样考虑,原始num(1)为9的倍数,其中(1)表示第一次数字相加前的num,其各位数字为Xn,Xn-1,X2,x1,则对于num(1)+1来说,若0<=x1<=8,X1=X1+1,其余不变,则num(2)=num(2)+1,如此类推,num(end)=num(end)+1,则为1;若x1=9,则x1=0,x2=x2+1,若0<=x2<=8,num(2)=num(2)-9+1=num(2)-8,相当于num(2)+1,如此类推。可以得到,num%9的结果就是最后的结果。
代码:
1 class Solution { 2 public: 3 int addDigits(int num) { 4 if (num == 0){ 5 return 0; 6 } 7 else if(num%9 == 0){ 8 return 9; 9 } 10 else{ 11 return num%9; 12 } 13 } 14 };
其中,若num==0时,应该返回0;num%9==0时,返回9,其他返回num%9。
原文:http://www.cnblogs.com/lfwllq/p/5118234.html