JS乘法持久性函数问题:输入39返回值不符合预期
乘法持久性函数修正方案
你的代码逻辑存在顺序问题,导致最后一次关键的乘法操作未被计数。以输入39为例,当处理到['1','4']时,你的代码会先判断multiply后的结果'4'是一位数,直接跳出循环,而没有把这次1*4=4的操作计入计数器,所以返回2而不是正确的3。
问题代码的核心问题
循环中你先检查乘法结果是否为一位数,若为真则直接终止循环,跳过了最后一次操作的计数。正确的逻辑应该是:只要当前数字不是一位数,就执行乘法操作并计数,直到数字变为一位数为止。
修正后的代码
function persistence(num) { let numStr = num.toString(); let counter = 0; const multiply = (str) => { let product = 1; for (const char of str) { product *= parseInt(char, 10); } return product.toString(); }; // 当数字的字符串长度大于1时,持续执行乘法操作 while (numStr.length > 1) { numStr = multiply(numStr); counter++; } return counter; }
关键改进点
- 调整循环逻辑:以当前数字的字符串长度是否大于1作为循环条件,确保每次非一位数的数字都会被处理并计数。
- 简化数组操作:直接使用字符串处理,避免频繁的
split和toString转换,更高效。 - 给
parseInt添加基数参数10,避免潜在的进制解析问题。
测试输入39时,执行流程如下:
- 初始
numStr = '39',长度>1 → 计算3*9=27,counter=1 numStr = '27',长度>1 → 计算2*7=14,counter=2numStr = '14',长度>1 → 计算1*4=4,counter=3numStr = '4',长度=1 → 循环终止,返回3
内容的提问来源于stack exchange,提问作者N. Hughes
相关产品推荐
相关产品推荐

