Leetcode - Math -258. Add Digits(數位求和,規律題)

1. Problem Description 

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爲止。


2. My solution1(Loop)

直接模擬過程,其中wei是求各位和函數。
class Solution {
public:
    int wei(int num)
    {
        int ans=0;
        while(num>0)
        {
            ans+=num%10;
            num/=10;
        }
        return ans;
    }
    int addDigits(int num) {
        int tmp=num;
        while(tmp>=10)
            tmp=wei(tmp);
        return tmp;
    }
};


3. My solution2(O[1]算法)

class Solution
{
public:
    int addDigits(int num)
    {
        if(num==0) return 0;
        if(num%9==0)   return 9;
        else   return num%9;
    }
};


接下來我們將利用已知定理證明:
已知:
①( a + b ) % x =a % x + b % x
②遞歸重複求解一個x進制數num的各位之和,最終一定得到一個(0~x-1)之間的數
可得:
①一個n位x進制數num的各位之和對(x-1)取餘,與這個數num本身對(x-1)取餘的答案相同。
②遞歸重複求解一個x進制數num的各位之和對(x-1取餘),與這個數num本身對(x-1)取餘的答案相同。




證明:
任何一個10進制數num,都可以表示成這樣一個多項式和,如4位數。


這裏以2369爲例。


8765=8+7+6+5+8*999+7*99+6*9+5*0
我們知道這個式子中右邊的部分8*999+7*99+6*9+5*0一定可以被9整除,他們對9取餘得到0。
又已知存在定理:
①( a + b ) % x =a % x + b % x
也就是說:
8765 % 9 =(8+7+6+5)% 9 +(8*999+7*99+6*9+5*0)% 9 =(8+7+6+5)% 9 ……………①
8765% 9 = 26 % 9 = 8
於是我們得到一個新的結論:
一個n位x進制數num的各位之和對(x-1)取餘,與這個數num本身對(x-1)取餘的答案相同。

現在我們想要知道這個數各位一直求和得到的0~9之間的數是多少,就將其對9取模即可。

所以得到return num%9就可以了。但是當num=9的倍數時,最後一步將得到9;當num=0時,又會得到0,需要特殊判定一下。

    if(num==0) return 0;
      if(num%9==0)   return 9;
      else   return num%9;

網上總結出的公式,也可以直接:

return num-1%9+1


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章