刷题笔记4
多多的数字组合
多多君最近在研究某种数字组合: 定义为:每个数字的十进制表示中(0~9),每个数位各不相同且各个数位之和等于N。 满足条件的数字可能很多,找到其中的最小值即可。
多多君还有很多研究课题,于是多多君找到了你--未来的计算机科学家寻求帮助。
共一行,一个正整数N,如题意所示,表示组合中数字不同数位之和。
(1 <= N <= 1,000)
共一行,一个整数,表示该组合中的最小值。
如果组合中没有任何符合条件的数字,那么输出-1即可。
输入例子:
5
输出例子:
5
例子说明:
符合条件的数字有:5,14,23,32,41
其中最小值为5
js
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// 定义一个函数,输入一个正整数,输出它的各个数位之和
function sumOfDigits(n) {
// 初始化和为0
let sum = 0;
// 循环,直到n为0
while (n > 0) {
// 用求余运算获取最低位的数字,加到和上
sum += n % 10;
// 用除法运算去掉最低位的数字,向下取整
n = Math.floor(n / 10);
}
// 返回和
return sum;
}
// 定义一个函数,输入一个正整数N,输出组合中的最小值
function minOfCombination(N) {
// 初始化最小值为-1,表示没有找到
let min = -1;
// 从1开始遍历,直到1000
for (let i = 1; i <= 100000; i++) {
// 如果当前数字的各个数位之和等于N,说明找到了一个符合条件的数字
if (sumOfDigits(i) === N) {
// 将最小值更新为当前数字
min = i;
// 跳出循环,不用再继续查找
break;
}
}
// 返回最小值
return min;
}
while ((line = await readline())) {
let tokens = line.split(" ");
let a = parseInt(tokens[0]);
console.log(minOfCombination(a));
}
})();