目录
题目描述
输入描述
输出描述
用例
题目解析
算法源码
所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。
例如153是水仙花数,153是一个3位数,并且153 = 1^3 + 5^3 + 3^3。
第一行输入一个整数n,表示一个n位的正整数。n在3到7之间,包含3和7。
第二行输入一个正整数m,表示需要返回第m个水仙花数。
返回长度是n的第m个水仙花数。个数从0开始编号。
若m大于水仙花数的个数,返回最后一个水仙花数和m的乘积。
若输入不合法,返回-1。
输入 | 3 |
输出 | 153 |
说明 | 153是第一个水仙花数 |
输入 | 9 |
输出 | -1 |
说明 | 9超出范围 |
这道题实现逻辑并不难,大家可以看下面算法源码。
但是本题的水仙花数最长可以有7位,也就是百万级别的,虽然下面算法差不多是O(n)的,但是估计也Hold不住。
暂时还没想到更好的办法。
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {let [n, m] = lines.map(Number);console.log(getSxh(n, m));lines.length = 0;}
});function getSxh(n, m) {if (n < 3 || n > 7) return -1;let start = [1, ...new Array(n - 1).fill(0)].join("") - 0;let end = new Array(n).fill(9).join("") - 0;let last;for (let i = start; i <= end; i++) {const val = [...String(i)].reduce((p, c) => {p += Math.pow(c, n);return p;}, 0);if (val === i) {if (--m === -1) {return i;} else {last = val;}}}if (last) return last;return -1;
}