题目
给定一个非负整数
num
,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
输入: num = 38 输出: 2 解释: 各位相加的过程为: 38 --> 3 + 8 --> 11 11 --> 1 + 1 --> 2 由于 2 是一位数,所以返回 2。
思路一
我们这里的可以使用循环结合递归来实现,我们在函数内部先判断一下形参num是否小于10,如果小于10就是1位数,我们不需要做任何操作,直接将其返回即可,如果不是小于10,我们就先声明一个sum变量,默认值为0,然后使用while循环进行判断,当前的形参num是否大于等1,如果是则进入循环,再循环内部我们将形参num除以10将其余数于sum变量相加且重新赋值给sum变量,然后再使用Math.floor方法进行向下取整,最后我们将sum数传递给自己函数,在进行循环即可
var addDigits = function(num) { if (num < 10){ return num; } let sum = 0; while (num >= 1){ sum += num % 10; num = Math.floor(num/10); } return addDigits(sum); };
思路二
我们这里还可以直接使用双循环,在函数中先声明一个n变量,他的值是形参num,然后使用while循环,循环条件为当前的n值大于等于10则进入循环,在循环中我们在声明两个变量,分别为x和y,x的值是变量n使用toString()方法后的返回值,然后再使用循环对x变量进行循环,在循环中我们把当前x的循环值使用parseInt方法转换为数字,然后在和y进行相加并重新赋值给y变量,最后将变量y赋值给变量n,当循环结束后,我们将变量n返回出去即可
var addDigits = function(num) { let n = num while(n >= 10){ var x = n.toString() var y = 0 for(let i = 0 ; i < x.length; i++){ y += parseInt(x[i]); } n = y } return n };