吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

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

[复制链接]
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[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++] 纯文本查看 复制代码
#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, 2024-11-1 06:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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