HJ6 质数因子
数学概念:质数因子,我们也可以称为质因子、质因数、素因子、素因数(素数和质数指的是一种)。一个数的质因数是指这个数的因数中为质数的那些因数。
在数学上,任何大于1的正整数都能被拆分成若干个质数的乘积。一个质数只有一个质因数就是它本身。
一个数 x 一定可以由两个因数相乘的到,且其中一个因数 <= √x ,另一个因数 >= √x (质数可以由 1 和它本身相乘得到)
原题
输入:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
输出:按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
解题思路
假设问题是求 x 的质因数。由于1不是质数(所以1就不会是质因数),所以我们先从2做为被除数开始,然后 3,4,5...一直到 √x。在这个过程中,我们先用 x 当除数,如果 x 除以2(或者2后面的被除数)得到 y 无余数,那么我们就可以把问题转化成求 y 的质因数,得到 y 的质因数后,在前面补上 2 (或者2后面的被除数)就是我们原题所求;如果在 2 到 √x 之间,没有一个数做为被除数可以被整除,那么 x 本身就是一个质数,它的质因数只有它本身。
注释:为什么说可以直接补上2(或者后面的被除数),万一这个数不是质数呢?假设这个数是w, 如果这个数不是质数,那么这个数就可以分成两个更小的数相乘(把1和本身除去了),假设这两个因数是 p 和 q,那么所求 x 就可以用 p, q, y 三个数相乘表示(可以用 p * (q*y) 两个数相乘表示),那么在 w 之前 p 作为x的被除数的时候,就已经把问题转化为求w 整除 p 的商的质因子了,就不会出现x 除以 w 这种情况了。所以可以直接补上2(或者后面的被除数)。
代码实现
// node 环境
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
// Write your code here
let num = await readline()
num = parseInt(num.trim())
let result = []
for(let i=2; i*i <= num; i++) {
if (num % i === 0) {
result.push(i)
num = num / i
i = 1;
}
}
// 经过上述过程,num 是 1 或者一个质数。当输入 num 本身是 1 的时候得到 1,当 输入 num 不是 1 的时候,会得到一个质数( num 会是它本身或者 原输入 num 的一个质因数)。只有当 num 不是 1 的情况,我们才需要将这个数添加到质因数数组中。
if(num !=1) {
result.push(num)
}
console.log(result.join(' '));
}()