数位排序
题目描述
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?
输入格式
输入第一行包含一个正整数 n。
第二行包含一个正整数 m。
输出格式
输出一行包含一个整数,表示答案
输入样例
在这里给出一组输入。例如:
13
5
输出样例
在这里给出相应的输出。例如:
3
代码实现
#include<stdio.h>
int main()
{
int n,m;
int count = 0;
scanf("%d",&n);
scanf("%d",&m);
int a[n];//储存 1 到 n 的元素
int b[n];//计算数位之和
int c[n];//最终排序
int i,j,sum = 0;
for(i=0;i<n;i++)
{
a[i] = i+1;
}
for(i=0;i<9;i++)//0到9的位数和就是它本身
{
b[i]=a[i];
}
for(i=9;i<n;i++)//从10开始计算位数之和
{
int k = a[i];
while(k)
{
int t = k%10;
sum += t;
k/=10;
}
b[i] = sum;
sum = 0;//把sum的值清空
}
int l=1;
int k = 0;
while(k<n)//当k==n时,说明所有的数都已经排好序了
{
for(j=0;j<n;j++)
{
if(b[j]==l)//从位数和为1开始给所有的数排序
{
c[k] = a[j];
k++;
}
}
l++;
}
printf("%d\n",c[m-1]);//输出排在第 m 个的元素,m-1是因为之前以0为下标开始
return 0;
}