【解题思路】


        ① 身为一个懒癌患者,当然是数组能少开就少开,排序次数能少则少,嘿嘿,不建议学习,仅当作一种解题思路;

        ② 根据题意看似要将奇数和偶数分开来排序,但其实可以通过改变数据来进行统一排序的;



【1】奇数在前,偶数在后


        这一目的充分利用数据规则就可以实现,比如利用“输入数据小于等于30000”这一条件,有两种实现的办法:


        ① 将所有奇数加上30000,再将全部数据按从大到小排序;


        20221001145037.png


        ② 将所有偶数加上30000,再将全部数据按从小到大排序。


        20221001145654.png


        上述两种操作都能将奇偶分开,且奇数加上30000还是奇数,偶数加上30000也还是偶数,后续输出时很好分辨。



【2】奇数按从大到小排序


        从大到小排列,这不是正好契合了上面第【1】点讨论的第 ① 种情况么。



【3】偶数按从小到大排序


        再对上面第【1】点讨论的第 ① 种情况的偶数部分做一下数据转变即可,让偶数的值等于30000减去该偶数。


        20221001151735.png


        数据转变后进行所有数据的从大到小排列,偶数部分自然就变成从小到大排列了,且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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论