门户网站报价单,邢台公司网站建设,全国兼职网站建设,天津城市建设招标网站题目链接
蓝桥杯2022年第十三届省赛真题-数位排序 - C语言网
题目理解 按照数位之和给数排序。当两个数各个数位之和不同时#xff0c;将数位和较小的排在前面#xff0c;当数位之和相等时#xff0c;将数值小的排在前面。第一次输入一个数字N#xff0c;求1到数字N之间所…题目链接
蓝桥杯2022年第十三届省赛真题-数位排序 - C语言网
题目理解 按照数位之和给数排序。当两个数各个数位之和不同时将数位和较小的排在前面当数位之和相等时将数值小的排在前面。第一次输入一个数字N求1到数字N之间所有数字的各位之和对其进行排序第二次输入的是各位之和顺序中从小到大的第M个数字。输出该数字的真实值。
解题思路 这段代码的主要思路是通过计算每个数的各位数和并将结果存储到结构体数组中然后对结构体数组进行排序最后输出排序后的第m个数的原数。
具体步骤如下 定义一个结构体number其中包含两个成员变量a和b分别用于存储原数和各位数和。 通过scanf函数获取输入的两个整数n和m。 初始化结构体数组arr数组大小为n1。 第一个循环从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个数。
完整代码
#includestdio.h
#includestdlib.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 i1;in;i)//将原数存储到arr[i].a中{arr[i].ai;}for(int i1;in;i)//计算每个数的各位数和将结果存储到arr[i].b中{int tarr[i].a;while(t0){arr[i].bt%10;t/10;}}qsort(arr,n1,sizeof(struct number),compare);//使用qsort函数对结构体数组arr进行排序printf(%d,arr[m].a);
}
———如有问题欢迎评论区提问———