小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当
两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,
将数值小的排在前面。
例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位
之和 13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元
素是多少?
【输入格式】
输入第一行包含一个正整数 n。
第二行包含一个正整数 m。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
13
5
【样例输出】
3
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int SWH(int n);
int n, m, t,i,j, a[1000];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
a[i] = i + 1;
}
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
if (SWH(a[i]) > SWH(a[i+1]))
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
if (SWH(a[i]) == SWH(a[i + 1]))
{
if (a[i] > a[i + 1])
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
int SWH(int n)
{
int t;
{
if (1 <= n <= 9)
t = 0 + 0 + 0 + n;
else if (n <= 99)
t = 0 + 0 + n / 10 + n % 10;
else if (n <= 999)
t = n / 100 + n % 100 / 10 + n % 100 % 10;
else if (n = 1000)
t = 1;
}
return (int) t;
}
输入13,但是排序就是顺序排序,没有执行题目要求完成排序
期间也改了很多次,但没有什么效果
请学长帮忙看下,这个代码该如何修改
修改处见注释,供参考:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int SWH(int n);
int n, m, t,i,j, a[1000];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
a[i] = i + 1;
}
scanf("%d", &m); //修改
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
if (SWH(a[i]) > SWH(a[i+1]))
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
else if (SWH(a[i]) == SWH(a[i + 1])) //修改:else
{
if (a[i] > a[i + 1])
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
for (i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
printf("%d", a[m-1]); //修改
return 0;
}
int SWH(int n)
{
int t = 0;
//{
if (1 <= n && n <= 9) //if (1 <= n <= 9) 修改
t = 0 + 0 + 0 + n;
else if (n <= 99)
t = 0 + 0 + n / 10 + n % 10;
else if (n <= 999)
t = n / 100 + n /10 % 10 + n % 10;
// t = n / 100 + n % 100 / 10 + n % 100 % 10; 修改
else if (n == 1000) // else if (n = 1000) 修改
t = 1;
//}
return t;
}