数字组合
题目描述
多多君最近在研究某种数字组合,定义为:每个数字的十进制表示中(0~9),每个数位各不相同,且各个数位之和等于 N。
满足条件的数字可能很多,找到其中的最小值即可。
多多君还有很多研究课题,于是多多君找到了你——未来的计算机科学家寻求帮助。
数据范围
- 1 - 1000
- 进阶:空间复杂度 O(1),时间复杂度 O(n)
输入描述
共一行,一个正整数 N,如题意所示,表示组合中数字不同数位之和。 (1 <= N <= 1,000)
输出描述
共一行,一个整数,表示该组合中的最小值。
如果组合中没有任何符合条件的数字,那么输出 -1 即可。
示例
示例 1
- 输入:
5 - 输出:
5 - 说明:符合条件的数字有
5, 14, 23, 32, 41,其中最小值为5
示例 2
- 输入:
12 - 输出:
39
示例 3
- 输入:
50 - 输出:
-1 - 说明:没有符合条件的数字
答案
ts
import { createInterface } from "node:readline/promises";
import { stdin, stdout } from "node:process";
const rl = createInterface({ input: stdin, output: stdout });
const n = Number(await rl.question("请输入正整数:"));
function theSmallestNum(num:number): number {
//位数
const weishu = Math.trunc(num / 9) + 1;
let result: number = 0;
let n: number = -1;
for (let i = 1; i <= weishu; i++) {
if (num - 9 > 0) {
num -= 9;
result += 9 * (10 ** (i - 1))
} else {
result += num * (10 ** (i - 1))
}
}
return result <= 1000 ? result : -1;
}
console.log(theSmallestNum(n));
rl.close();附录
1. 取整
Math.trunc(num: number) => number
Math.trunc 会直接去掉小数部分,向零取整,返回整数部分。
ts
Math.trunc(5.9); // 5
Math.trunc(14 / 9); // 12. 幂运算
10 ** n => number
** 是幂运算符,等价于 Math.pow(10, n)。这里用 10 ** (i - 1) 得到第 i 位(从个位开始)对应的权重。
ts
10 ** 0; // 1
10 ** 2; // 1003. 字符串转数字
Number(value: string) => number
将字符串转换为数字,常用于把 readline 读到的输入转为数值。
ts
Number("12"); // 12