Javascript 对负数的数字求和

Javascript 对负数的数字求和,javascript,reduce,Javascript,Reduce,'编写一个名为sumdights的函数,该函数将数字作为输入并 返回每个数字的十进制数之和 数字。” 第一个数字为负数时,如何求和 例如:sumdights-32;//-3 + 2 = -1; 我能部分解决它 函数sumDigitsnumber{ 返回Math.absnumber.toString.split.ReduceFunction a,b{ 返回parseInta+parseIntb; }, 0; } console.log-32 这里有一个方法来做这件事 将输入字符串化并在每个字符上

'编写一个名为sumdights的函数,该函数将数字作为输入并 返回每个数字的十进制数之和 数字。”

第一个数字为负数时,如何求和

例如:sumdights-32;//-3 + 2 = -1;

我能部分解决它

函数sumDigitsnumber{ 返回Math.absnumber.toString.split.ReduceFunction a,b{ 返回parseInta+parseIntb; }, 0; }
console.log-32 这里有一个方法来做这件事

将输入字符串化并在每个字符上拆分。 使用reduce迭代字符。 使用0和1的乘法器初始化累加器。 如果第一个字符是a-,则将乘数设置为-1 对于后续字符,将数字与乘法器相乘,并将其添加到总和中。然后将乘法器设置回1,以便下一个数字只与1相乘。 常量sumdights=x=>[…`${x}`]{ 返回i==0&&x=='-'?{sum:0,mult:-1}:{sum:sum+mult*x,mult:1}; },{sum:0,mult:1}.sum; console.logsumdights-32;//-1. console.logsumDigits32;//5.
console.logsumDigits5555;//20这里有一个方法

将输入字符串化并在每个字符上拆分。 使用reduce迭代字符。 使用0和1的乘法器初始化累加器。 如果第一个字符是a-,则将乘数设置为-1 对于后续字符,将数字与乘法器相乘,并将其添加到总和中。然后将乘法器设置回1,以便下一个数字只与1相乘。 常量sumdights=x=>[…`${x}`]{ 返回i==0&&x=='-'?{sum:0,mult:-1}:{sum:sum+mult*x,mult:1}; },{sum:0,mult:1}.sum; console.logsumdights-32;//-1. console.logsumDigits32;//5.
console.logsumDigits5555;//20您可以采用不同的方法来分隔数字,并在第一个数字上保留一个可能的符号

返回

['-3', '2']
函数sumDigitsnumber{ 返回编号.toString.match/-?\d/g.ReduceFunction A,b{ 返回a++b; }, 0; }
console.logsum-32 您可以采用不同的方法来分隔数字,并在第一个数字上保留一个可能的符号

返回

['-3', '2']
函数sumDigitsnumber{ 返回编号.toString.match/-?\d/g.ReduceFunction A,b{ 返回a++b; }, 0; }
console.logsum-32 这里有一种不用字符串转换的方法-

常数sumdights=n=0=> n<0 ? n>-10 ? N :-n%10+n/10>>0 :n<10 ? N :n%10+n/10>>0 console.logsum-321 // -3 + 2 + 1 // => 0 console.logsumDigits321 // 3 + 2 + 1
//=>6这里有一种不用字符串转换的方法-

常数sumdights=n=0=> n<0 ? n>-10 ? N :-n%10+n/10>>0 :n<10 ? N :n%10+n/10>>0 console.logsum-321 // -3 + 2 + 1 // => 0 console.logsumDigits321 // 3 + 2 + 1
//=>6首先,小数位数仅表示小数点右侧的字符。将数字转换为字符串将设置为JavaScript字符串是字符数组。因此,接下来的问题就是将十进制数字拆分,然后通过迭代该数组对其求和,然后转换回数字类型

//'编写一个名为sumDigits的函数,该函数将数字作为输入,并返回每个数字的十进制数字之和。' var a=10.12345; var b=-1012345; 函数sumDigitsx{ var结果=0; x=x.toString; x=x.split'.[1]; 如果x==null{ //没有小数位数可求和! 返回没有小数位数可求和! } 对于变量i=0;i如果digit>=0&&digit首先,十进制数字仅表示小数点右侧的字符。将数字转换为字符串会将您设置为JavaScript字符串是字符数组。因此,只需将十进制数字拆分,然后通过迭代该数组求和,然后转换回数字类型即可

//'编写一个名为sumDigits的函数,该函数将数字作为输入,并返回每个数字的十进制数字之和。' var a=10.12345; var b=-1012345; 函数sumDigitsx{ var结果=0; x=x.toString; x=x.split'.[1]; 如果x==null{ //没有小数位数可求和! 返回没有小数位数可求和! } 对于变量i=0;i如果digit>=0&&digit这是一种不需要转换为字符串的方法,适用于那些受到质疑的人

将数字转换为其绝对值,使用模运算符循环,在除以10后对余数求和,直到保留1的值,然后在原始数字为负数时减去最左边的数字

C onst sumdights=n=>{ 设和=0; 设neg=n<0?真:假; n=neg?数学。absn:n; 而{
if neg&&n是一种不需要转换为字符串的方法,适用于那些受到质疑的人

将数字转换为其绝对值,使用模运算符循环,在除以10后对余数求和,直到保留1的值,然后在原始数字为负数时减去最左边的数字

常数sumdights=n=>{ 设和=0; 设neg=n<0?真:假; n=neg?数学。absn:n; 而{
如果neg&&n简单的数学和递归可以很快解决这个问题

回想一下,当您将一个数字除以10时,余数是其最右边的十进制数字,商的整数部分是由剩余数字组成的数字。换句话说:

let n = 5678;
console.log(n % 10); // => 8
console.log(Math.floor(n / 10)); // => 567
考虑到这一点,对数字进行求和是一个简单的递归过程:

程序

n除以10。 将数字设置为余数。 将n设置为商的整数部分。 如果n=0,则返回数字。 否则,返回数字+过程 保留最左边数字的符号会增加少量复杂性,但不会增加太多。以下是JavaScript中的外观:

函数digitSumn,符号=1{ 如果n<0{ 符号=-1;//保存符号 n=Math.absn; } 常量位数=n%10;//n÷10的余数| n=Math.floorn/10;//n÷10的整数部分| 如果n==0{ 返回符号*digit;//没有剩余数字,返回带符号的最终数字 } return digit+digitSumn,sign;//将数字添加到剩余数字的总和中 } console.logdigitSum32;//=>5
console.logdigitSum-32;//=>-1简单的数学和递归可以很快解决这个问题

回想一下,当您将一个数字除以10时,余数是其最右边的十进制数字,商的整数部分是由剩余数字组成的数字。换句话说:

let n = 5678;
console.log(n % 10); // => 8
console.log(Math.floor(n / 10)); // => 567
考虑到这一点,对数字进行求和是一个简单的递归过程:

程序

n除以10。 将数字设置为余数。 将n设置为商的整数部分。 如果n=0,则返回数字。 否则,返回数字+过程 保留最左边数字的符号会增加少量复杂性,但不会增加太多。以下是JavaScript中的外观:

函数digitSumn,符号=1{ 如果n<0{ 符号=-1;//保存符号 n=Math.absn; } 常量位数=n%10;//n÷10的余数| n=Math.floorn/10;//n÷10的整数部分| 如果n==0{ 返回符号*digit;//没有剩余数字,返回带符号的最终数字 } return digit+digitSumn,sign;//将数字添加到剩余数字的总和中 } console.logdigitSum32;//=>5
console.logdigitSum-32;//=>-1//尝试此操作以获取负片总数:

const sumOfNegative = (numbers) => {
  let sum = 0;
  numbers.forEach((number) => {
    if (number < 0) {
      sum += number;
    }
  });
  return sum;
};

//尝试此操作以获得负数的总和:

const sumOfNegative = (numbers) => {
  let sum = 0;
  numbers.forEach((number) => {
    if (number < 0) {
      sum += number;
    }
  });
  return sum;
};

例如:sumDigits-32;//-3+2=-1;-这与您的说明相矛盾。每个数字的十进制数字的绝对值之和将是|-3 |+2=5,否?没有负绝对值。我想您的老师不希望您使用字符串函数。此外,数字的绝对值是无意义的。顺便说一句,Math.absnumber删除符号。十进制数字仅表示小数点右侧的数字。例如:sumdights-32;//-3+2=-1;-这与您的说明相矛盾。每个数字的十进制数字的绝对值之和为|-3 |+2=5,不?没有负绝对值。我想您的老师不想让您使用字符串这是不正确的。此外,数字的绝对值是无意义的。顺便说一句,Math.absnumber删除符号。十进制数字只表示小数点右侧的数字。哪些字符是十进制数字?换句话说,只有数字小数点右侧的部分,对吗?@RonRoyston,我认为给定的数字没有标号是的,但具体来说是十进制数字。如果数字不是十进制数字,它就超出了任务的范围。对吗?哪些字符是十进制数字?换句话说,只有小数点右边的数字部分,对吗?@RonRoyston,我认为给定的数字没有位。但具体来说,是十进制数字。如果数字是不是十进制数字,它不在任务范围内。对吗?好东西,但是parseIntn/10看起来很迂回。你基本上是将它转换为字符串,然后再转换回数字。Math.floorn/10或n/10 | 0如何?@georg你是对的。我使用parseInt是因为Math.floor将负数舍入Math。floor-1.5===-2,出于某种原因我确信parseInt不会费心将数字参数强制转换为字符串,但我发现我错了。|0本来是一个更好的解决方案,但现在它没有意义,因为我先做了Math.abs,所以Math.floor工作正常。我更新了我的答案。感谢反馈!好东西,但是parseIntn/10 lo oks相当迂回,基本上是将其转换为字符串,然后再转换为数字。那么Math.floorn/10或n/10 | 0呢?@georg你说得对。我之所以使用parseInt,是因为Math.floor将负数舍入Math.floor-1.5===-2,出于某种原因,我确信parseInt不会费心将数字参数强制转换为字符串,但我发现我错了|0本来是一个更好的解决方案,但由于我先做Math.abs,所以Math.floor效果很好,所以现在没有意义了。我已经更新了我的答案。谢谢你的反馈!