算法题解-各位相加

114 阅读2分钟

题目

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。

输入: num = 38
输出: 2 

题解

第一种

我们在函数中先定义了两个变量num_circle和res,num_circle变量用来保留num的值,res用来存储num参数的数字之和,然后我们接下来使用一个循环,循环条件为无限循环,在循环内部,我们在使用一个循环,我们在内部循环中先将num_circle的值赋给res,并在num_circle重置为0,然后我们不断将num_circle的数加入到res中,并将num_circle除以10取整,以便处理下一位数,当num_circle为0时,表示已经处理完了num的所有位数,接下来我们判断res-去10之后是否小于0,如果满足我们则直接返回res,此时表示已经得到了最终结果,否则我们将res的值赋给num_circle,并将res重置为0,以便继续处理下一轮的数字之和即可

var addDigits = function(num) {
    let num_circle = num;
    let res = 0;    
    while(true){
        while(num_circle != 0){
            res += num_circle % 10;
            num_circle = Math.floor(num_circle / 10);
        }
        if(res - 10 < 0){
            return res;
        }else{
            num_circle = res;
            res = 0;
        }
    }
};

第二种

我们在函数中先定义了一个内部函数a,该函数的作用主要用于计算数字根,在该函数内部,首先判断输入的数字是否只有一位,如果是我们则直接返回该数字,否则我们就通过toString()方法将输入的数字转换为字符串,并使用split方法将其拆分为单个数字字符,然后我们声明一个sum变量,默认值为0,接下来我们使用循环进行遍历所有的数字字符,并通过parseInt方法将它们转换为整数后进行相加后存储到sum变量中,这样我们就可以得到所有数字之和,接下来我们将得到的数字之和作为参数递归调用函数a,继续计算数字根,直到最终得到的数字只有一位为止,最后我们在主函数中调用a函数,然后我们返回计算得到的数字根即可

var addDigits = function(num) {
    function a(value) {
        if(String(value).length === 1) {
            return value
        }
        value = value.toString().split('')
        let sum = 0
        for(let i=0;i<value.length;i++) {
            sum += parseInt(value[i])
        }
        return a(sum)
    }
    return a(num)
};

坚持努力,无惧未来!