js常规解法
解法一:
let readline = require('readline'); const r1 = readline.createInterface(process.stdin,process.stdout); let res = []; let print = function(line){ for(let i=2;i<=line;i++){ if(line%i == 0){ res.push(i); print(parseInt(line)/i) break } } } r1.on('line',(line)=>{ print(line) console.log(res.join(' ')) })
结果运行时间和内存都不满足要求。于是略微改动,先判断这个数是不是质数,这样遍历数可减少为Math.sqrt(num)。
解法二: 耗时48ms 内存7828kb
let readline = require('readline'); const r1 = readline.createInterface(process.stdin,process.stdout); let res = []; let isPrime = function(num){ for (let j = 2; j <= Math.sqrt(num); j++){ if (num%j==0){ return false; } } return true; } let print = function(line,i){ if(isPrime(line)){ res.push(line) }else{ for(;i<=line;i++){ if(line%i == 0){ res.push(i); let val = parseInt(line)/i; print(val,i); break; } } } }; r1.on('line',(line)=>{ print(line,2); console.log(res.join(' ')); })
想到了在递归的时候就把遍历数改为Math.sqrt(num)。
解法三: 52ms 7724kb
let readline = require('readline'); const r1 = readline.createInterface(process.stdin,process.stdout); let res = []; let print = function(line){ for(let i=2;i<=Math.sqrt(line);i++){ if(line%i == 0){ res.push(i); print(parseInt(line)/i) break } } } r1.on('line',(line)=>{ print(line); if(res.length==0){ console.log(line+' ') }else{ let ans = res.reduce((pre,cur)=>{ return pre*cur }) res.push(line / ans) console.log(res.join(' ')) } })
这种处理方式在输入为质数的时候需要单独判断,耗时竟然比解法二还慢一丢丢...?.