使用while循环将整数拆分为数字,然后将数字相乘

时间:2018-07-08 09:58:40

标签: javascript parsing while-loop split

尝试使用codewars kate(Persistent Bugger),您必须取一个整数并将数字相乘,直到结果小于10(答案是达到10以下的次数)。

例如39 === 3,因为:

  1. 3 * 9 = 27,
  2. 2 * 7 = 14,
  3. 1 * 4 = 4

我的逻辑是使用while循环,因此,当multipliedNum> 10时,将整数拆分为单个数字,将数字相乘(每次将计数加1),然后如果结果为<10,则返回计数。 / p>

我的问题是,我不确定这段代码在哪里出问题,它没有返回任何内容:

function persistence(num) {
  let multipliedNum = num;
  let count = 0;

  while (multipliedNum > 10) {
    multipliedNum = (num + '').split('').reduce((previousValue, currentValue) =>
      parseInt(previousValue, 10) * parseInt(currentValue, 10));
    count += 1;
  }

  if (multipliedNum < 10) {
    return count;
  }
}

persistence(39);

关于我要去哪里的任何线索都很好! (这里有点JS初学者)

4 个答案:

答案 0 :(得分:2)

您需要对while循环进行其他检查,因为您需要包括10才能进行乘法。

然后,您需要相同的变量来进行简化和简化。您可以选择num。如果出于相同的目的回收相同的变量,则不会造成损害。

然后对reduce进行简化的回调,parseInt是不必要的,因为通过使用乘法操作数*将隐式类型强制转换为数字。该运算符需要数字,并尝试将操作数转换为数字。

最后,只需返回计数-无需检查,就永远不会false

function persistence(num) {
    var count = 0;

    while (num > 9) {
        num = num.toString().split('').reduce((a, b) => a * b);
        count++;
    }
    return count;
}

console.log(persistence(39));

答案 1 :(得分:1)

代码的主要问题是由于以下条件,它陷入了无限循环:

while(multipliedNum > 10)

由于您一直坚持使用num并将其分配给multipliedNum,因此multipliedNum始终大于10。

请尝试以下操作:

function persistence(num) {
  let multipliedNum = num;
  let count = 0;

  while (multipliedNum > 10) {
    multipliedNum = (multipliedNum + '').split('').reduce((previousValue, currentValue) =>
      parseInt(previousValue, 10) * parseInt(currentValue, 10));
    count += 1;
  }
  if (multipliedNum < 10) {
    return count;
  }
}

console.log(persistence(39));

答案 2 :(得分:1)

@daggett ,如果您更喜欢使用递归,则以下代码也可以解决您的问题,但我不建议您使用此代码。

我刚刚介绍过使用递归解决您的问题,这是在大型应用程序中用于简化任务的绝佳概念。

输入 39 336

的示例日志
3 * 9 = 27
2 * 7 = 14
1 * 4 = 4
============
3 times


7 * 8 * 6 = 336
3 * 3 * 6 = 54
5 * 4 = 20
2 * 0 = 0
============
4 times

代码

function timeToGetNumberLessThan10(num) {
	var s = '' + num
	var chars = []

	if(s.length == 1)
		return 1

	sum = 1

	for(var i=0; i < s.length; i++) {
		chars.push(s[i])
		sum *= parseInt(s[i])
	}

	// Log message
	console.log(chars.join(' * ') + ' = ' + sum) 

	if(sum < 10) {
		return 1
	} else {
		// Recursive call
		return 1 + timeToGetNumberLessThan10(sum)
	}
}


// TEST 1
var count = timeToGetNumberLessThan10(39);
console.log('============')
console.log(count + ' times')

console.log('\n') // New line

// TEST 2
var count = timeToGetNumberLessThan10(786);
console.log('============')
console.log(count + ' times')

/*
3 * 9 = 27
2 * 7 = 14
1 * 4 = 4
============
3 times


7 * 8 * 6 = 336
3 * 3 * 6 = 54
5 * 4 = 20
2 * 0 = 0
============
4 times
*/

答案 3 :(得分:0)

while (multipliedNum > 10) {
  multipliedNum = (num + '').split('').reduce((previousValue, currentValue) =>
    parseInt(previousValue, 10) * parseInt(currentValue, 10));
  count += 1;
}

您要将结果分配给multipliedNum,但首先使用num,这意味着它会不断地重复分配相同的num。将num更改为multipliedNum