DotcppXF


私信TA

用户名:dotcpp0599925

访问量:5059

签 名:

层楼终究误少年

等  级
排  名 199
经  验 6540
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 华南理工大学
专  业 计算机科学与技术

  自我简介:

The sad truth is, not everyone will accomplish something great. Some of us may just have to find meaning in the little moments that make up life.


【解题思路】


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

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



【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分

2 人评分

  评论区

  • «
  • »