首页 > 试题广场 >

多多的数字组合

[编程题]多多的数字组合
  • 热度指数:7983 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
多多君最近在研究某种数字组合:
定义为:每个数字的十进制表示中(0~9),每个数位各不相同且各个数位之和等于N。
满足条件的数字可能很多,找到其中的最小值即可。
多多君还有很多研究课题,于是多多君找到了你--未来的计算机科学家寻求帮助。

数据范围:
进阶:空间复杂度 ,时间复杂度

输入描述:
共一行,一个正整数N,如题意所示,表示组合中数字不同数位之和。
(1 <= N <= 1,000)


输出描述:
共一行,一个整数,表示该组合中的最小值。
如果组合中没有任何符合条件的数字,那么输出-1即可。
示例1

输入

5

输出

5

说明

符合条件的数字有:5,14,23,32,41
其中最小值为5
示例2

输入

12

输出

39

说明


示例3

输入

50

输出

-1

说明

没有符合条件的数字 (T▽T) 
var compute = function(n){
    let index = 0;//组合数的第几位,比如1234,4在index=0那个位置
    let num = 0;//返回的最小数
    for (let i = 9; i > 0; i--) {//从9开始自减遍历,将大数放在最低位来保证结果最小
        if (n > 0 && i <= n) {
            n -= i;
            num += Math.pow(10, index) * i;
            index++;
        }
    }
    return num;
}
let n = parseInt(readline());//读取输入,并将字符转换为整数
if (n < 10) print(n);
else if (n > 45) {//要求数字的每一位都不同,所以最大1+2+3+4+5+6+7+8+9=45
    print(-1);
}
else print(compute(n))

编辑于 2023-03-04 22:07:21 回复(1)
//处理输入,保存到数组inputArr中
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
const inputArr = [];
rl.on('line', function(line){
    inputArr.push(parseInt(line));//将输入流转换为数字类型保存到inputArr中
}).on('close', function(){
    console.log(findMinNum(inputArr[0]));//调用解决函数并输出
})
//解决函数
function findMinNum(n) {
    if (n < 0 || n > 45) 
    {
        return - 1;
    }
    else if(n < 10){
        return n;
    }
    else if(n <= 17){
        return (n - 9) * 10 + 9;
    }
    else if(n <= 24){
        return (n - 17) * 100 + 89;
    }
    else if(n <= 30){
        return (n - 24) * 1000 + 789;
    }
    else if(n <= 35){
        return (n - 30) * 10000 + 6789;
    }
    else if(n <= 39){
        return (n - 35) * 100000 + 56789;
    }
    else if(n <= 42){
        return (n - 39) * 1000000 + 456789;
    }
    else if(n <= 44){
        return (n - 42) * 10000000 + 3456789;
    }
    else if(n == 45){
        return 123456789;
    }
}

发表于 2021-05-21 18:41:07 回复(1)