meanboo 发表于 2016-10-25 17:49

C++的一个练习题,大家来探讨探讨

题目:输入十个数字,将这十个数字中的偶数按照从小到大的顺序放在前面,同时将奇数从小到大放在偶数的后面。
下面是我自己的解决方法,比较低级,调试正常,大家来发表发表还有其他的方法么。


// Study-Project.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
const int Size = 10;
void function(const int *str,int size);

int main()
{
        int ch;
        cout << "Please enter ten numbers: " << endl;
        for (int x = 0; x < Size;x++)
          cin >> ch;   //输入10个数字作为测试
        function(ch,Size);
        system("pause");
        return 0;
}

void function(const int *str,int size)
{
        int tmp;
        int j = 0,count=0;
        int c = 0;//记录偶数的个数,同时作为奇数的起点
        int temp = {0};//初始化一个新的数组
///////////////////////////////////////////////////////////
        for (int i = 0; i < size; i++)
        {
                if (str % 2 == 0)                        
                {
                        temp = str;
                        j++;
                }
        }                                       //判断原数组的偶数成分,并将这些偶数存入新的数组中
//////////////////////////////////////////////////////////
        count = j;
        c = j;//获取偶数的个数
        while (count)
        {
                for (int i = j-count; i < j; i++)
                {
                        tmp = temp;
                        if (tmp>=temp)
                        {
                                tmp = temp;
                          temp=temp;
                                temp = tmp;
                        }
                }
                count--;
        }                                    //判断新的数组的偶数部分的大小,并排序
////////////////////////////////////////////////////////////
        for (int i = 0; i < size; i++)
        {
                if (str % 2 == 1)
                {
                        temp = str;
                        j++;
                }
        }                                    //判断原数组的奇数成分,并将这些奇数存入新的数组中
////////////////////////////////////////////////////////////
        count = j;
        while (count)
        {
                for (int i = j - count+c; i < size; i++)//其中j-count+c作为奇数的起点
                {
                        tmp = temp;
                        if (tmp >= temp)
                        {
                                tmp = temp;
                                temp = temp;
                                temp = tmp;
                        }
                }
                count--;
        }                                    ////判断新的数组的奇数部分的大小,并排序
        //////////////////////////////////////////////////////
        for (int i = 0; i < size; i++)
                cout << temp << " ";
}





Jungle、Risk 发表于 2016-10-25 20:13

我写了个双重循环的
思路如下:
直接用双重循环排序:
1、如果前后两个比较的数都为 奇数或偶数, 则比较大小并决定是否调换;
2、如果前后两个比较的数前面的为奇数,后面的为偶数,不计较大小,直接调换;
3、如果前后两个比较的数前面的为偶数,后面的为奇数,不管它。
#include <iostream>
#include <cstdlib>
#include <ctime>

int IsOddEven(int &a, int &b)
{
    if ( (a%2==1 && b%2==1) || (a%2==0 && b%2==0) )
    {
      return 1;
    }
    else if (a%2==1 && b%2==0)
    {
      return 2;
    }
    return 3;
}

int main()
{
    int a;

    srand(time(0));

    for (int i=0; i<10; i++)
    {
      a = rand()%100;
    }

    for (int i=0; i<9; i++)
    {
      for (int j=i; j<10; j++)
      {
            switch ( IsOddEven(a, a) )
            {
                case 1: // 都为奇数或都为偶数
                {
                  if (a > a)
                  {
                        std::swap(a, a);
                  }
                  break;
                }

                case 2: // 前面奇数,后面偶数
                {
                  std::swap(a, a);
                  break;
                }

                default: break;
            }
      }
    }

    for (int i=0; i<10; i++)
    {
      std::cout << a << '\t';
    }
    return 0;
}


数字是随机生成的。


meanboo 发表于 2016-10-25 20:12

吾愛じ啃飯團ジ 发表于 2016-10-25 19:25
这样把 楼主 代码我就不写了 给你个 思路:
先排序。
然后再用循环 判断是否 偶数奇数 分别存放 按顺序存 ...

对哦 ,先排序的话可以省不少事,我之前是先区分奇偶的,然后再排序,这样就麻烦了点

fuzhi228899 发表于 2016-10-25 18:36

输入有待改进,直接用字符串输入把~

meanboo 发表于 2016-10-25 18:39

fuzhi228899 发表于 2016-10-25 18:36
输入有待改进,直接用字符串输入把~

下次使用string来保存数组

IWayne 发表于 2016-10-25 19:10

我想说 这代码 又丑又长。 还有更好的方法你可以再想想。

IWayne 发表于 2016-10-25 19:13

我感觉两个循环可以解决。。。。

11212122 发表于 2016-10-25 19:13

cin 这样使用会缓冲区溢出


cin.getline(szBuf, sizeof(szBuf), '\n');


//cin.ignore(sizeof(szBuf), '\n');

cin.clear();
cin.sync();

IWayne 发表于 2016-10-25 19:14

我好像 又想到 用一个循环解决。。。

IWayne 发表于 2016-10-25 19:25

这样把 楼主 代码我就不写了 给你个 思路:
先排序。
然后再用循环 判断是否 偶数奇数 分别存放 按顺序存放
最后结合两个 变量。

第二种就是
用一个循环
排序的时候 把 值放进变量 这样循环替放 到最后 。。。

tmpsforjxp 发表于 2016-10-25 19:39

这道题,从时间复杂度上来说,楼主做成了O(n的平方),从空间复杂度来说做成了O(n),答案正确但是不是优解。。。
我算法也不好,因为是无序数串,楼主可以试试快排或者堆排序(但是要自己根据奇偶来选择插入位置)

meanboo 发表于 2016-10-25 20:10

吾愛じ啃飯團ジ 发表于 2016-10-25 19:10
我想说 这代码 又丑又长。 还有更好的方法你可以再想想。

嗯嗯,这只是我一开始的想法
页: [1] 2
查看完整版本: C++的一个练习题,大家来探讨探讨