7-1 找完数
原题:
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
.
解题思路:
解题思路:
-
根据题目给出关键信息:目标数等于除自身外的因子之和
-
已知的数据: m和n的范围
-
解题顺序:
- 创建空数组用于存放完数
- 遍历m,n范围内的完数并添加到空数组
- 检查是否为空数组,是则输出None,反之输出因子之和
.
JavaScript(node)代码:
const readLine = require("readline");
const rl = readLine.createInterface({
input: process.stdin,
output: process.stdout
});
//用户输入
rl.question('',(input) => {
// 解析输入,获取 m 和 n 的值
const [m , n] = input.split(' ').map(Number);
const perfectNums = [];
// 遍历从 m 到 n 的数字
for (let i = m; i <= n; i++){
let tempSum = 0;
// 找到 i 的因数并计算它们的和
for (let j = 1; j < i; j++){
if (i % j == 0){
tempSum+=j;
}
}
// 如果因数之和等于 i,则它是一个完美数
if (tempSum == i){
perfectNums.push(i);
}
}
// 输出结果
if (perfectNums.length == 0){
console.log("None");
}else {
for ( const i of perfectNums){
const tempValue = [];
// 找完美数的因数
for (let j = 1; j < i; j++){
if(i % j == 0){
tempValue.push(j);
}
}
// 输出完美数及其因数
console.log(`${
i} = ${
tempValue.join(' + ')}`);
}
}
// 关闭 readline 接口
rl.close();
});
.
复杂度分析:
时间复杂度:O((n-m+1)*(i-1))(最坏情况)
空间复杂度:O(1)