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 << " ";
}
我写了个双重循环的
思路如下:
直接用双重循环排序:
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;
}
数字是随机生成的。
吾愛じ啃飯團ジ 发表于 2016-10-25 19:25
这样把 楼主 代码我就不写了 给你个 思路:
先排序。
然后再用循环 判断是否 偶数奇数 分别存放 按顺序存 ...
对哦 ,先排序的话可以省不少事,我之前是先区分奇偶的,然后再排序,这样就麻烦了点 输入有待改进,直接用字符串输入把~ fuzhi228899 发表于 2016-10-25 18:36
输入有待改进,直接用字符串输入把~
下次使用string来保存数组 我想说 这代码 又丑又长。 还有更好的方法你可以再想想。 我感觉两个循环可以解决。。。。 cin 这样使用会缓冲区溢出
cin.getline(szBuf, sizeof(szBuf), '\n');
//cin.ignore(sizeof(szBuf), '\n');
cin.clear();
cin.sync(); 我好像 又想到 用一个循环解决。。。 这样把 楼主 代码我就不写了 给你个 思路:
先排序。
然后再用循环 判断是否 偶数奇数 分别存放 按顺序存放
最后结合两个 变量。
第二种就是
用一个循环
排序的时候 把 值放进变量 这样循环替放 到最后 。。。 这道题,从时间复杂度上来说,楼主做成了O(n的平方),从空间复杂度来说做成了O(n),答案正确但是不是优解。。。
我算法也不好,因为是无序数串,楼主可以试试快排或者堆排序(但是要自己根据奇偶来选择插入位置) 吾愛じ啃飯團ジ 发表于 2016-10-25 19:10
我想说 这代码 又丑又长。 还有更好的方法你可以再想想。
嗯嗯,这只是我一开始的想法
页:
[1]
2