题目链接:
问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
输入格式
输入第一行包含一个正整数 n 。
第二行包含一个正整数 m 。
输出格式
输出一行包含一个整数, 表示答案。
样例输入
13 5
样例输出
3
样例说明
1 到 13 的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3 。
解法一:
import java.util.Scanner; public class 数位排序 { static long[] a = new long[(int) 1e6]; static int sum(int n){ int t = 0; while (n!=0){ t =t+n%10; n/=10; } return t; } public static void main(String[] args) { int n,m,l=0,g=0; Scanner sc = new Scanner(System.in); n = sc.nextInt(); m = sc.nextInt(); for (int i = 1; i <=54 ; i++) { for (int j = 1; j <=n ; j++) { l = sum(j); if (l==i){ a[g++]=j; } l=0; } } System.out.println(a[m-1]); } }
解法二:
import java.util.Scanner; import java.util.Arrays; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此输入您的代码... int n = scan.nextInt(); int m = scan.nextInt(); Integer[] array = new Integer[n]; for (int i = 0; i < n; i++) { array[i] = i + 1; } Arrays.sort(array, (o1, o2) -> digitSum(o1) != digitSum(o2) ? digitSum(o1) - digitSum(o2) : o1 - o2); System.out.println(array[m - 1]); scan.close(); } private static int digitSum(Integer num) { int ans = 0; while (num > 0) { ans += num % 10; num /= 10; } return ans; } }