【解题思路】
① 身为一个懒癌患者,当然是数组能少开就少开,排序次数能少则少,嘿嘿,不建议学习,仅当作一种解题思路;
② 根据题意看似要将奇数和偶数分开来排序,但其实可以通过改变数据来进行统一排序的;
【1】奇数在前,偶数在后
这一目的充分利用数据规则就可以实现,比如利用“输入数据小于等于30000”这一条件,有两种实现的办法:
① 将所有奇数加上30000,再将全部数据按从大到小排序;
② 将所有偶数加上30000,再将全部数据按从小到大排序。
上述两种操作都能将奇偶分开,且奇数加上30000还是奇数,偶数加上30000也还是偶数,后续输出时很好分辨。
【2】奇数按从大到小排序
从大到小排列,这不是正好契合了上面第【1】点讨论的第 ① 种情况么。
【3】偶数按从小到大排序
再对上面第【1】点讨论的第 ① 种情况的偶数部分做一下数据转变即可,让偶数的值等于30000减去该偶数。
数据转变后进行所有数据的从大到小排列,偶数部分自然就变成从小到大排列了,且30000减去偶数也还是偶数。
【注意事项】
① 注意题目给出的数据条件即可,数据做了变换处理后,排完序记得变回去。
【参考代码】
#include<stdio.h> int main(void) { int a[11]; for(int i=1;i<=10;i++) { scanf("%d",&a[i]); // 输入10个数 a[i]=a[i]%2==0?30000-a[i]:30000+a[i]; // 若是奇数加3W,若是偶数被3W减 } for(int i=1;i<=10;i++) // 从大到小排序 for(int j=i+1;j<=10;j++) if(a[j]>a[i]) // 交换a[i]和a[j] { a[0]=a[j]; // a[0]仅做交换变量使用 a[j]=a[i]; a[i]=a[0]; } for(int i=1;i<=10;i++) { if(i!=1) // 按输出要求加空格 printf(" "); if(a[i]%2==0) // 输出排完序的的数,把数变回去 printf("%d",30000-a[i]); else printf("%d",a[i]-30000); } return 0; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复