题目链接
蓝桥杯2022年第十三届省赛真题-数位排序 - C语言网
题目理解
按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。第一次输入一个数字N,求1到数字N之间所有数字的各位之和对其进行排序,第二次输入的是各位之和顺序中从小到大的第M个数字。输出该数字的真实值。
解题思路
这段代码的主要思路是通过计算每个数的各位数和,并将结果存储到结构体数组中,然后对结构体数组进行排序,最后输出排序后的第m个数的原数。
具体步骤如下:
-
定义一个结构体
number
,其中包含两个成员变量a
和b
,分别用于存储原数和各位数和。 -
通过
scanf
函数获取输入的两个整数n和m。 -
初始化结构体数组
arr
,数组大小为n+1。 -
第一个循环从1到n,将每个数的原数存储到
arr[i].a
中。 -
第二个循环从1到n,计算每个数的各位数和,并将结果存储到
arr[i].b
中。具体计算方法是通过循环取每个数的个位数,然后将个位数累加到各位数和arr[i].b
中,再将该数除以10,继续取下一位数,直到该数变为0。 -
使用
q
函数对结构体数组arr
进行排序,排序的依据是首先按照各位数和b
进行升序排序,如果各位数和相同,则按照原数a
进行升序排序。(qsort函数不会的同学用冒泡排序也是可以的,不过qsort函数不难,还是建议学习一下) -
通过
printf
函数输出排序后的第m个数的原数arr[m].a
。
总结来说,这段代码的思路是通过计算每个数的各位数和,并将结果存储到结构体数组中,然后对结构体数组进行排序,最后输出排序后的第m个数的原数。这样就能找到给定范围内各位数和最小的第m个数。
完整代码
#include<stdio.h>
#include<stdlib.h>
struct number
{int a;//存储原数int b;//存储各位数和
};
int compare(const void *a, const void *b)
{struct number num1 = *(struct number *)a;struct number num2 = *(struct number *)b;if (num1.b != num2.b) //如果各位数和相同,则按照原数a进行升序排序{return num1.b - num2.b;} else//排序依据首先按照各位数和b进行升序排序{return num1.a - num2.a;}
}
main()
{struct number arr[1000001]={0};int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)//将原数存储到arr[i].a中{arr[i].a=i;}for(int i=1;i<=n;i++)//计算每个数的各位数和,将结果存储到arr[i].b中{int t=arr[i].a;while(t>0){arr[i].b+=t%10;t/=10;}}qsort(arr,n+1,sizeof(struct number),compare);//使用qsort函数对结构体数组arr进行排序printf("%d",arr[m].a);
}
———(如有问题,欢迎评论区提问)———