Skip to content
On this page

刷题笔记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));
    }
})();

上次更新于: