吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4067|回复: 16
收起左侧

[C&C++ 转载] C++的一个练习题,大家来探讨探讨

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


[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// 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[Size];
    cout << "Please enter ten numbers: " << endl;
    for (int x = 0; x < Size;x++)
        cin >> ch[x];     //输入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[Size] = {0};//初始化一个新的数组
///////////////////////////////////////////////////////////
    for (int i = 0; i < size; i++)
    {
        if (str[i] % 2 == 0)                       
        {
            temp[j] = str[i];
            j++;
        }
    }                                       //判断原数组的偶数成分,并将这些偶数存入新的数组中
//////////////////////////////////////////////////////////
    count = j;
    c = j;//获取偶数的个数
    while (count)
    {
        for (int i = j-count; i < j; i++)
        {
            tmp = temp[j - count];
            if (tmp>=temp[i])
            {
                tmp = temp[i];
                temp[i]=temp[j - count];
                temp[j - count] = tmp;
            }
        }
        count--;
    }                                      //判断新的数组的偶数部分的大小,并排序
////////////////////////////////////////////////////////////
    for (int i = 0; i < size; i++)
    {
        if (str[i] % 2 == 1)
        {
            temp[j] = str[i];
            j++;
        }
    }                                      //判断原数组的奇数成分,并将这些奇数存入新的数组中
////////////////////////////////////////////////////////////
    count = j;
    while (count)
    {
        for (int i = j - count+c; i < size; i++)//其中j-count+c作为奇数的起点
        {
            tmp = temp[j - count+c];
            if (tmp >= temp[i])
            {
                tmp = temp[i];
                temp[i] = temp[j - count+c];
                temp[j - count+c] = tmp;
            }
        }
        count--;
    }                                    ////判断新的数组的奇数部分的大小,并排序
    //////////////////////////////////////////////////////
    for (int i = 0; i < size; i++)
        cout << temp[i] << " ";
}




捕获.PNG

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Jungle、Risk 发表于 2016-10-25 20:13
我写了个双重循环的
思路如下:
直接用双重循环排序:
1、如果前后两个比较的数都为 奇数偶数, 则比较大小并决定是否调换;
2、如果前后两个比较的数前面的为奇数后面的为偶数,不计较大小,直接调换;
3、如果前后两个比较的数前面的为偶数后面的为奇数,不管它。
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#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[10];
 
    srand(time(0));
 
    for (int i=0; i<10; i++)
    {
        a[i] = rand()%100;
    }
 
    for (int i=0; i<9; i++)
    {
        for (int j=i; j<10; j++)
        {
            switch ( IsOddEven(a[i], a[j]) )
            {
                case 1: // 都为奇数或都为偶数
                {
                    if (a[i] > a[j])
                    {
                        std::swap(a[i], a[j]);
                    }
                    break;
                }
 
                case 2: // 前面奇数,后面偶数
                {
                    std::swap(a[i], a[j]);
                    break;
                }
 
                default: break;
            }
        }
    }
 
    for (int i=0; i<10; i++)
    {
        std::cout << a[i] << '\t';
    }
    return 0;
}


数字是随机生成的。

QQ截图20161025201139.png
 楼主| 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
我想说 这代码 又丑又长。 还有更好的方法你可以再想想。

嗯嗯,这只是我一开始的想法
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-5 13:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表