leetcode 258- Add Digits

来源:互联网 发布:二维数组整体排序java 编辑:程序博客网 时间:2024/06/05 01:07

leetcode题目汇集 — Add Digits

leetcode 258- 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.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
题目要求很简单,即对于给定的非负整数,将该数的各位相加直到各位相加的和小于10。

解法1
很容易想到用loop的方式得到最终结果,代码如下

public class Solution {    public int addDigits(int num) {        while (num > 9) {            int temp = 0;            while (num != 0) {                temp += num % 10;                num /= 10;            }            num = temp;        }        return num;    }} 

当然这种方法很笨,没有任何技巧性。

解法2
点击提示中的网址https://en.wikipedia.org/wiki/Digital_root,发现这是一个求数字根的问题。
数字根有一些性质
假设数字根为函数F
1.非负整数n的数字根m=1+(n-1)%9,即F(n)=1+(n-1)%9
2.任何数加9的数字根等于自身的数字根,即F(n+9)=F(n)
小学学加法的时候我们都明白,一个数字加9,就是把十位加1,个位减1。因此十位加个位的和是不变的;如果十位加1后仍然有进位,即十位上是9,那么进位之后十位会变成0,百位会加1,道理和一个一位数加9是一样的。
3.9乘任何数字的数字根都是9。
同样是小学时学乘法时,我们在计算一位数乘九的时候,把十只手指头排开,乘几便弯下第几只手指头,前后的手指个数便是那个结果。它的数字根永远是10-1=9。多位数的化,拆分每一位数字即可。
4.数字根的三则运算
1.两数之和的数字根等于这两个数的数字根的和数字根
对于两个一位数来说,很容易理解。因为一位数的数字根就是它本身。
对于多位数来说,由性质1,把每个数字mod 9,就又变成了两个一位数。
2.两数之积的数字根等于这两个数的数字根的积的和数字根
可以把每个数字拆成许多9相加的形式,最后各剩余一个 (a mod 9), 由
(a1+a2+…)(b1+b2+…)=a1(b1+b2+…)+a2*(b1+b2+…)+…+an*bm
从a1到a[n-1]都是9,由性质2,原来两式的数字根就是(an*bm)的数字根。而由性质1,可知an,bm又是两数本身的数字根。
3.一个数字的n次幂的数字根等于这个数字的数字根的n次幂的和数字根
知道数字根的定义以及性质,很容易写出不用loop的代码

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