如何从数组中删除奇数

时间:2019-03-26 07:42:15

标签: c++

看起来每当在行中有连续的奇数三行时    数组中的行。中间的一个不会被移除。    我知道为什么会这样,但是我不太确定该如何解决。

这是针对C ++的。

#include <iostream>

using namespace std;

void removeodd(int arr[],int& number)//{1,2,3,6,7,9,5,8};
{int count=0;
    for(int i=0; i<number; i++)
    {
        if(arr[i]%2!=0)
        {   
            int j=i+1;
            for(int k=i;k<number; k++)
        {
            arr[k]=arr[j]; 
            j++;
        }
            count++;
        }
    }
    number=number-count;
    for(int i=0; i<number; i++){
        cout<<arr[i]<<" ";
    }
}
int main(){
    int size=8;
    int ary[8]={1,2,3,6,7,9,5,8};

    removeodd(ary, size);

    return 0;
}

output of the code above is 2 6 9 8

4 个答案:

答案 0 :(得分:0)

问题在于,即使删除了奇数,您也总是在前进索引。因此,如果有两个奇数,则删除第一个,并将索引移到第二个之后。要解决此问题,请在删除奇数时再次降低索引。所以之后:

count++;

也这样:

i--;

您得到的输出是:

  

2 6 8

答案 1 :(得分:0)

在您的for循环中。

假定值1删除时的值。

并且数组ary中的{是{2,3,6,7,9,5,8}

但是我的值是1,所以您没有检查值2是奇数。

因此修复循环检查所有值。

答案 2 :(得分:0)

  1. 可能会要求您显示偶数元素,而不是将其删除。 您实际上不能从纯数组中删除元素。但是,您可以做的是将偶数元素从较高的索引复制到较低的索引,并返回偶数的数目:

    之前1 2 3 4;大小为4

    之后2 4 3 4;新的“大小”为2(实际大小仍为4

  2. 您的函数称为removeodd不是 removeodd_and_display_even。照你说的做。

解决方案live):

#include <iostream>

int removeodd(int arr[], int arrsize)
{
  int di = 0; // di == destination index
  for (int si = 0; si < arrsize; ++si) // si == source index
    if (arr[si] % 2 == 0) // even number => copy it
      arr[di++] = arr[si]; // assign arr[si] to arr[di], then increment di
  return di; // "size" of new array
}

int main()
{
  int size = 8;
  int ary[8] = { 1,2,3,6,7,9,5,8 };

  int newsize = removeodd(ary, size);
  for (int i = 0; i < newsize; ++i)
    std::cout << ary[i] << ' ';

  return 0;
}

答案 3 :(得分:0)

您使用基本类型的数组(例如int)而不是C ++容器来麻烦自己,C ++容器包含允许您.erase()数组中任何元素的成员函数。选择vector<int>可以让您以平凡的方式删除奇数。

例如,

#include <vector>
...
std::vector<int> arr {1,2,9,6,7,3,5,8};

将创建arrayvector<int>。作为向量容器,您可以使用简单的迭代器将向量中的每个元素从arr.begin()迭代到arr.end()。唯一的警告是,每次擦除后必须重新验证迭代器,因为容器更改时迭代器无效。要重新验证迭代器,您只需分配.erase()操作的结果,例如

    for (auto it = arr.begin(); it != arr.end();) { /* iterate vector */
        if (*it & 1u)           /* if value is odd */
            it = arr.erase(it); /* erase it saving/revalidating iter */
        else        /* otherwise */
            it++;               /* simply advance iter */
    }

在一个简短的示例中将其放在一起,该示例将输出原始arr,删除奇数,然后在删除了奇数的情况下再次输出arr,您可以这样做:

#include <iostream>
#include <vector>

int main (void) {

    std::vector<int> arr {1,2,9,6,7,3,5,8};

    for (auto& v: arr)          /* output original vector contents */
        std::cout << " " << v;
    std::cout << '\n';

    for (auto it = arr.begin(); it != arr.end();) { /* iterate vector */
        if (*it & 1u)           /* if value is odd */
            it = arr.erase(it); /* erase it saving/revalidating iter */
        else        /* otherwise */
            it++;               /* simply advance iter */
    }

    /* output remaining even values */
    for (auto& v: arr)
        std::cout << " " << v;
    std::cout << '\n';
}

使用/输出示例

$ ./bin/vect_remove_odd
 1 2 9 6 7 3 5 8
 2 6 8

仔细检查一下,如果还有其他问题,请告诉我。