【Leetcode】258. Add Digits

題目地址:

https://leetcode.com/problems/add-digits/

給定一個非負整數nn,加總其各位數之和得到另一個整數,再重複做此操作直到得到一位數。求那個一位數。

首先如果這個數本身就是一位數,則返回自己;否則判斷一下其能否被99整除,如果能則返回99,否則返回餘數。代碼如下:

public class Solution {
    public int addDigits(int num) {
        if (num < 10) {
            return num;
        }
        
        int res = num % 9;
        return res == 0 ? 9 : res;
    }
}

時空複雜度O(1)O(1)

算法正確性證明:
x=a0+a110+a2102+...+an10nx=a_0+a_110+a_210^2+...+a_n10^n,則xi=0nai(mod  9)x\equiv\sum_{i=0}^na_i (\mod 9)所以最後所得的一位數與其各位數之和模99同餘。然而非零數各位數之和最後算出來不可能是00,所以只能是99

然而爲什麼最後一定會得到一個一位數呢(嚴格來說這個”非常顯然“的結論也是需要證明的)?可以由i=0nai<x\sum_{i=0}^na_i<x再加上數學歸納法證明。這裏就不證了。

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