题目:调整奇数偶数顺序
内容:
调整数组使奇数全部都位于偶数前面。
要求:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
我的思路是我们首先将数字放入数组中,并记录下数组中的数字奇数和偶数分别的个数将其存放到变量num_ji和num_ou中。
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("请输入十个整数:\n");
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
int len = sizeof(arr) / sizeof(arr[0]);
int num_ou = 0;
int num_ji = 0;
for (int j = 0; j < len; j++)//计算输入的数组中的奇偶数分别的个数
{
if (arr[j] % 2 == 0)
{
num_ou++;
}
else
{
num_ji++;
}
}
其次我们编写一个函数来完成我们最终的目的:调整奇数偶数顺序
我们首先思考一下:
对于如上的一串数字我们可以类似于我们做排序时候的思想一样来遍历数组交换前后数字,而我们在这道题里面所需要的不是数字大小而是根据奇偶来交换由此我们想出了如果前一个数字是偶数后一个数字是奇数我们便交换他俩的位置,多次遍历交换便可以达到我们想要的效果。
for (i = 0; i < sz; i++)
{
if (arr[i] % 2 == 0 && arr[i + 1] % 2 == 1)
{
tmp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = tmp;
}
}
上面的代码仅仅只是遍历一次数组,还达不到我们的预期因此我们需要外层多次循环来实现
在此给出整体函数实现和思想:
//传递函数四个参数分别是传递数组,数组总的元素个数,数组中奇数个数,数组中偶数个数
void hanshu(int* arr, int sz, int ji, int ou)
{
int i = 0;
int j = 0;
int k = 0;
int flog = 1;
int tmp = 0;
while (flog)
{
//一次while中遍历整个数组当偶数在前奇数在后时,交换偶数与奇数的位置
for (i = 0; i < sz; i++)
{
if (arr[i] % 2 == 0 && arr[i + 1] % 2 == 1)
{
tmp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = tmp;
}
}
int count = 0;
//判断是否前面奇数个数的长度的位置全为奇数来终止while循环
for (int k = 0; k < ji; k++)
{
if (arr[k] % 2 == 0)
{
break;
}
else
{
count++;
}
}
//当前面的数正好与输入的数字奇数个数匹配时就使得flog=0跳出while循环
if (count == ji)
{
flog = 0;
}
}
for (int n = 0; n < sz; n++)
{
printf("%d ", arr[n]);
}
}
该函数便可以完成我们想要的效果
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include
void hanshu(int* arr, int sz, int ji, int ou)
{
int i = 0;
int j = 0;
int k = 0;
int flog = 1;
int tmp = 0;
while (flog)
{
//一次while中遍历整个数组当偶数在前奇数在后时,交换偶数与奇数的位置
for (i = 0; i < sz; i++)
{
if (arr[i] % 2 == 0 && arr[i + 1] % 2 == 1)
{
tmp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = tmp;
}
}
int count = 0;
//判断是否前面奇数个数的长度的位置全为奇数来终止while循环
for (int k = 0; k < ji; k++)
{
if (arr[k] % 2 == 0)
{
break;
}
else
{
count++;
}
}
//当前面的数正好与输入的数字奇数个数匹配时就使得flog=0跳出while循环
if (count == ji)
{
flog = 0;
}
}
for (int n = 0; n < sz; n++)
{
printf("%d ", arr[n]);
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("请输入十个整数:\n");
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
int len = sizeof(arr) / sizeof(arr[0]);
int num_ou = 0;
int num_ji = 0;
for (int j = 0; j < len; j++)//计算输入的数组中的奇偶数分别的个数
{
if (arr[j] % 2 == 0)
{
num_ou++;
}
else
{
num_ji++;
}
}
hanshu(arr, len, num_ji, num_ou);
return 0;
}
今天的妙解C语言到此结束,希望以上内容对你解题有所帮助。别忘了一键三连哦。