258. Add Digits

来源:互联网 发布:nvidia软件 编辑:程序博客网 时间:2024/05/14 18:34

博文地址:http://blog.csdn.net/u014203453/article/details/52523403
题目:Add Digits

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.For example:Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it.题目大概意思是给定一个非负整数num,循环地加他的所有位上的数字,直到得到一位数为止。

思路:这其实是一种数字根(digit root),可以用来校验数字是否正确。现假设num为一个5位数的数字,那么可以把它用另一种形式表示,拆分如下:

num=a×10000+b×1000+c×100+d×10+e

将其拆为两部分:
num=(a+b+c+d+e )+(a×9999+b×999+c×99+d×9 )

观察发现,第①部分就是题目要求的数字之和,第②部分则是剩下的。现在问题是如何去掉第②部分,而只保留第一部分,让结果num看起来就是他的几个数字之和呢?事实上,仔细观察第②部分就会发现,它始终是9的倍数,也就是直接让num对9取余可以抹掉第②部分,当然第一部分也会被取余,我们暂且认为第①部分取余是不变的(实际上也可以看做一种余)。如此就得到了一次迭代,即
num=num%9=a+b+c+d+e

运算后,假设num是一个两位数的数字,则其又可以按照上法进行分解,直至num变为一位数,即是最终结果。但是值得注意的是,
0,,01~9

因此,为了匹配正整数的取值范围,计算方法不能直接使用
result=num%9

而应该写作
result=(num1)%9+1

最后,程序实现如下:

public class Solution {    public int addDigits(int num) {        return (num - 1) % 9 + 1;    }}
1 0
原创粉丝点击