问
多多君最近在研究某种数字组合: 定义为:每个数字的十进制表示中(0~9),每个数位各不相同且各个数位之和等于N。 满足条件的数字可能很多,找到其中的最小值即可。 多多君还有很多研究课题,于是多多君找到了你--未来的计算机科学家寻求帮助。
输入描述:
共一行,一个正整数N,如题意所示,表示组合中数字不同数位之和。(1 <= N <= 1,000)
输出描述:
共一行,一个整数,表示该组合中的最小值。如果组合中没有任何符合条件的数字,那么输出-1即可。
输入例子1:
5
输出例子1:
5
例子说明1:
符合条件的数字有:5,14,23,32,41其中最小值为5
输入例子2:
12
输出例子2:
39
例子说明2:
符合条件的数字有:5,14,23,32,41其中最小值为5
输入例子3:
50
输出例子3:
-1
例子说明3:
没有符合条件的数字 (T▽T)
读题
一道通过枚举就可以得出结果的题。
给定一个数字,要求各个数位上的数字之和等于它,而且要各不相同。 比如说:给一个数字——10。满足条件的有 19,28,37,73,45,还可以是 127,136。然后要取其中最小的,就是 19 了。
这个是怎么判断出来的,和已经给出来了,拿自然是取一个数少一个数。如果是要最后表示的数字中选最小的,肯定是位数越少越好。既然是越少越好。肯定是从个位数开始,从 9 开始取起,这样后面排到的差(十分位/百分数)就越少。即后面的数字越大,前面被分到的数字就越小。 比如,表示数字 19。 从个数为 9 开始,从后往前,上 8,还剩下差值为 2。最后最小的数字就是 289。像这样,从后往前,从 9 递减依次取,最后相差的用 Δ 补齐。
已知这样的数字组合规律后,为什么会有“没有符合条件的数字”呢?
答:原来,要求每个位数上的数字各不相同,而只有 0~9 中九个数字可以选,所以数字总会用完的。
按照这样的规律,依次列出,可以得到以下的表:
区间 | 位数 | n |
---|---|---|
0~9 | 1 | n |
10~18 | 2 | 19~89 |
19~24 | 3 | 189~789 |
25~30 | 4 | 1789~6789 |
31~35 | 5 | 16789~56789 |
36~39 | 6 | 156789~456789 |
40~42 | 7 | 1456789~3456789 |
43~44 | 8 | 13456789~23456789 |
45 | 9 | 123456789 |
到 45 这里,数字就被用完了。
到这里,数字表示随着数字的大小范围的变化就一目了然了。后面就是归纳了。
1.如果 x 在 [0,9] 之间,就为本身; 2.如果 x 在 [10,,18] 之间,就是 差值后跟上 9; 3.如果 x 在 [19,24] 之间,就是差值后跟上 89; ...
这时候当然是用一串 if-else 完成了!既然题目没有要求说最后结果要整数,那么就输出字符串(字符串拼接起来也方便)。
写&调试
import java.util.*;
/*
[编程题]多多的数字组合
https://www.nowcoder.com/questionTerminal/3d6b53e097ea41bda049d111f30db28e
*/
public class Main {
public static String func(int n) {
String s = "";
// 0-9
if (n <= 9)
return s+n;
// 10-18
else if (n > 9 && n <= 18)
return n-9+"9";
// 19-24
else if (n > 18 && n <= 24)
return n-17+"89";
// 25-30
else if (n > 24 && n <= 30)
return n-24+"789";
// 31-35
else if (n > 30 && n <= 35)
return n-30+"6789";
// 36-39
else if (n > 35 && n <= 39)
return n-35+"56789";
// 40-42
else if (n > 39 && n <= 42)
return n-39+"456789";
// 43-44
else if (n > 42 && n <= 44)
return n-42+"3456789";
else if (n == 45)
return "123456789";
else
return "-1";
}
public static void main(String[] args) {
Scanner sn = new Scanner(System.in);
int n = sn.nextInt();
String res = "";
System.out.println(func(n));
}
}
结果
答案正确:恭喜!您提交的程序通过了所有的测试用例
小结
枚举出来数字,找到表示的规律就不难。