Javascript - 如何求和一个数的所有首位和末位,直到只剩下两位数?

Javascript - How to sum up all the first and last digit of a number until only two digits are left?

我对编程还很陌生,只了解 Javascript 和 Swift 中的基础知识。我正在尝试编写一个简单的程序,它通过将第一个和最后一个数字相加直到最后只剩下两个数字来从任何输入的数字创建一个两位数。

这是一个例子:

num = 1234567:

1+7 = 8
2+6 = 8
3+5 = 8
4 remains

So the first result is: 8884. Now everything is added again:

8+8 = 16
8+4 = 12

The result is 1612. Again everything is summed up:

1+2 = 3
6+1 = 7

The result is 37 - which is also the final result.

我正在为两件事而苦苦挣扎。首先是 while 循环。我正在考虑转换 num.toString() 然后做一个像这样的 while 循环,在其中我再次将字符串更改为 int:

num.toString()
while (num.length > 2) {
    num = num.parseInt(num, 10);
    ...
}

但这不能正常工作,而且我猜它变得非常复杂,因为我必须在每个新回合之间切换字符串和整数,对吗?

我知道如何将所有数字相加,直到我得到一个两位数(我花了一段时间才弄明白这个数字),我什至不确定这是否是一个好方法:

var sum = num
    .toString()
    .split('')
    .map(Number)
    .reduce(function (a, b) {
        return a + b;
    }, 0);

但显然我不能在这里使用它,我不知道如何更改代码以便将第一个数字和最后一个数字相加。

试试这个哥们。它只是使用简单的 for 循环。它循环到数字的一半并添加相应的。根据您的逻辑,最终结果应该是 73 而不是 37

function sum(num){
        //if num is greater than or equal to 2 end the function and return final value
 if(num.length <= 2) return num;
        //converting the num to string beacuse first time input will be number
 num = String(num);
 let result = '';
        //creating a loop upto half of length of the num
 for(let i = 0;i<num.length/2;i++){
                //if the number is not middle one
  if(i !== num.length - 1 - i)
  {
                        //adding the sum of corresponding numbers to result
   result += parseInt(num[i]) + parseInt(num[num.length - 1 - i]);
  }
                //if the number is middle number just add it to result   
                else result += num[i] 
 }
 return sum(result);
}   
console.log(sum(1234567)) 

方法略有不同:

function sum(num) {
  var numString = num.toString();
  var newString = "";
  while (numString.length > 1) { // (1)
    newString += (parseInt(numString[0]) + parseInt(numString[numString.length - 1])).toString(); // (2)
    numString = numString.substring(1, numString.length - 1); // (3)
  }
  newString += numString; // (4)

  if (newString.length > 2) { // (5)
    console.log(newString)
    return sum(newString);
  } else {
    return newString;
  }
}


console.log(sum(1234567));

输出:

8884
1216
73

简要说明情况:

  • (1) 您的 while 循环将处理字符串,直到出现 1 或 还剩 0 个字符
  • (2) 将您的第一个字符和最后一个字符的总和添加到 你的 newString
  • (3) 删除你的第一个和最后一个字符 numString 现在它们已保存到 newString。因为 您正在覆盖 numString 中的值并缩小它,这 最终将满足 numString 的 while 条件 少于 2 个字符
  • (4) 将剩余的字符添加到 newString,这将是 1 个或 0 个字符,具体取决于 原始数字的长度
  • (5) 如果你的 newString 大于 2 字符,运行 再次使用此方法。否则 return 你的结果

您可以采用嵌套的 while 循环并检查外循环的字符串长度和内循环的左右索引

function add(n) {
    var s = n.toString(),
        l, r,
        sum;
    
    while (s.length > 2) {
        l = 0;
        r = s.length - 1;
        sum = [];
        while (l < r) {
            sum.push(+s[l++] + +s[r--]);
        }
        if (l === r) sum.push(s[l]);
        s = sum.join('');
    }
    return +s;
}

console.log(add(1234567));

相同,但具有递归功能。

function add(n) {
    var s = n.toString(),
        l = 0, r = s.length - 1,
        sum = [];
    
    if (s.length <= 2) return n;
    while (l < r) sum.push(+s[l++] + +s[r--]);
    if (l === r) sum.push(s[l]);
    return add(+sum.join(''));
}

console.log(add(1234567));