LeetCode简单题:258. 各位相加(Python,C++,Java)

一.解法

https://leetcode-cn.com/problems/add-digits/
要点:数学
这道题可以用循环方法解决,将给定的数字的各个位相加得到新的数字,一直重复这个过程,直到这个数小于 10,将这个数输出,具体见C++版本。
这道题关键在于数学知识的应用可以直接解决,用数根的性质完成。
数根是将一正整数的各个位数相加(即横向相加),若加完后的值大于10的话,则继续将各位数进行横向相加直到其值小于十为止,或是,将一数字重复做数字和,直到其值小于十为止,则所得的值为该数的数根。把 1 到 30 的树根列出来如下:
原数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
数根: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3
可以发现数根 9 个为一组, 1 - 9 循环出现。我们需要做就是把原数映射到树根就可以,循环出现利用取余。
对于给定的 n 有三种情况。
n 是 0 ,数根就是 0。
n 不是 9 的倍数,数根就是 n 对 9 取余,即 n mod 9。
n 是 9 的倍数,数根就是 9。
可以把两种情况统一起来,我们将给定的数字减 1,相当于原数整体向左偏移了 1,然后再将得到的数字对 9 取余,最后将得到的结果加 1 即可。
原数是 n,数根就可以表示成 (n-1) mod 9 + 1
Python和Java都是直接用数学方法完成。

二.Python实现

class Solution:
    def addDigits(self, num: int) -> int:
        if num > 9:
            num = num % 9
            if num == 0:
                return 9
        return num

三.C++实现

class Solution {
public:
    int addDigits(int num) {
        if(num==0) return 0;
       
        while(true){
            if (num<10) break;
            int temp=0;
            while(num>0){
                temp+=num%10;
                num/=10;
            }
            num=temp;
        }
        return num;
    }
};

四.java实现

class Solution {
    public int addDigits(int num) {
         return (num - 1) % 9 + 1;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。