题目链接
个人思路分析
所需要排序的是 1~n
之间的所有数,依次遍历每个数,计算出他们的数位之和。将数位之和数组按照题意排序。
参考代码
Java
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
static int n, m;
static class Num {
public int x, sumn;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
Num[] nums = new Num[n];
for (int i = 1; i <= n; ++i) {
nums[i - 1] = new Num();
nums[i - 1].x = i;
nums[i - 1].sumn = digitSum(i);
}
Arrays.sort(nums, new Comparator<Num>() {
@Override
public int compare(Num o1, Num o2) {
return o1.sumn == o2.sumn ? o1.x - o2.x : o1.sumn - o2.sumn;
}
});
System.out.println(nums[m - 1].x);
}
private static int digitSum(Integer num) {
int ans = 0;
while (num > 0) {
ans += num % 10;
num /= 10;
}
return ans;
}
}
Cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
const int N = 1e6 + 3;
int n, m, arr[N];
int sumn(int num)
{
int res = 0;
while(num)
{
res += num % 10;
num /= 10;
}
return res;
}
int cmp(int x1, int x2)
{
int a = sumn(x1),b = sumn(x2);
return a ==b ? x1 < x2 : a < b;
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i)
{
arr[i] = i;
}
sort(arr + 1, arr + n + 1, cmp);
printf("%d", arr[m]);
return 0;
}