首页 > 其他分享 >leetcode 258. 各位相加。数学

leetcode 258. 各位相加。数学

时间:2024-12-09 22:10:21浏览次数:4  
标签:10 return 结果 int 相加 数根 258 num leetcode

258. 各位相加

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。其中 0 ≤ num ≤ 2^31-1

法一:迭代

class Solution {
public:
    int addDigits(int num) {
        while(num >= 10){//判断千万别写成 num < 10 
            int sum = 0;
            while(num > 0){
                sum += num % 10;
                num /= 10;
            }
            num = sum;
        }
        return num;
    }
};

法二:递归

class Solution {
public:
    int addDigits(int num) {
        if (num < 10)  return num;
        int next = 0;
        while (num != 0) {
            next = next + num % 10;
            num /= 10;
        }
        return addDigits(next);
    }
};

法三:数学

要求的数叫做数字根,它的作用:

数根可以计算模运算的同余,对于非常大的数字的情况下可以节省很多时间。

数字根可作为一种检验计算正确性的方法。例如,两数字的和的数根等于两数字分别的数根的和。

另外,数根也可以用来判断数字的整除性,如果数根能被3或9整除,则原来的数也能被3或9整除。

num 与其各位相加的结果模 9 同余。重复计算各位相加的结果直到结果为一位数时,该一位数即为 num 的数根,num 与其数根模 9 同余。

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

或者

class Solution {
public:
    int addDigits(int num) {
        return (num - 1) % 9 + 1;
    }
};

值得注意的是:

对于取余的语言,结果的正负和左操作数相同,则 num−1 对 9 取余的结果为 −1,加 1 后得到结果 0,可以得到正确的结果;

对于取模的语言,结果的正负和右操作数相同,则 num−1 对 9 取模的结果为 8,加 1 后得到结果 9,无法得到正确的结果,此时需要对 num=0 的情况专门做处理。(比如Python)

 

标签:10,return,结果,int,相加,数根,258,num,leetcode
From: https://www.cnblogs.com/uacs2024/p/18596123

相关文章

  • leetcode 904. 水果成篮
    904.水果成篮说白了就是:找最多包含两种元素的最长子串,返回其长度值得注意的是,当窗口内有三种种类时,左窗口边界是要向右移动到窗口内只剩两种种类,而不是什么先进先出!比如[1,0,1,4,1,4,1,2,3] 法一:unordered_mapclassSolution{public:inttotalFruit(vector<int>&......
  • leetcode543.二叉树的直径
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • LeetCode题集-5 - 最长回文子串(一)
    题目:给你一个字符串 s,找到 s 中最长的回文子串。这一题作为中等难度,常规解法对于大多数人应该都没有难度。但是其中也有超难的解决办法,下面我们就一起由易到难,循序渐进地来解这道题。01、暴力破解法对于大多数题目来说,在不考虑性能的情况下,暴力破解法常常是最符合人的思维......
  • 力扣2.两数相加
    链表两数相加的问题与数组里面大数相加的问题一样。思路:我们从头开始遍历两个链表,当两个链表都没有到头时,我们正常将该节点的值进行相加,并且建立新的节点来保存当前位的值,加入到前面结果的结尾,同时保存进位的值;若当前任意一个链表没有到达末尾,我们应该继续运算,在运算时把已经......
  • (leetcode每日一题)有效的括号
    (leetcode每日一题)有效的括号题目要求思路代码总结题目给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左......
  • 代码随想录算法训练营第三十八天|leetcode322. 零钱兑换、leetcode279.完全平方数、le
    1leetcode322.零钱兑换题目链接:322.零钱兑换-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划之完全背包,装满背包最少的物品件数是多少?|LeetCode:322.零钱兑换哔哩哔哩bilibili思路:感觉跟之前的方法思路差不多,就是对dp初始化的时候,我开始弄错了,应该初始成无限大,对dp[......
  • LeetCode刷题 -- 哈希表
    目录两数之和题目解析算法原理代码面试题01.02.判定是否互为字符重排题目解析算法原理代码存在重复元素题目解析算法原理代码存在重复元素II题目解析算法原理代码字母异位词分组题目解析算法原理代码两数之和题目链接题目解析算法原理法一:暴力枚举,固定......
  • 【Leetcode Top 100】94. 二叉树的中序遍历
    问题背景给定一个二叉树的根节点rootrootroot,返回它的中序遍历。数据约......
  • 【Leetcode 每日一题】782. 变为棋盘
    问题背景一个n×nn\timesnn×n的二维网络b......
  • [LeetCode] 2684. Maximum Number of Moves in a Grid
    Youaregivena0-indexedmxnmatrixgridconsistingofpositiveintegers.Youcanstartatanycellinthefirstcolumnofthematrix,andtraversethegridinthefollowingway:Fromacell(row,col),youcanmovetoanyofthecells:(row-1,col+......