看起来每当在行中有连续的奇数三行时 数组中的行。中间的一个不会被移除。 我知道为什么会这样,但是我不太确定该如何解决。
这是针对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
答案 0 :(得分:0)
问题在于,即使删除了奇数,您也总是在前进索引。因此,如果有两个奇数,则删除第一个,并将索引移到第二个之后。要解决此问题,请在删除奇数时再次降低索引。所以之后:
count++;
也这样:
i--;
您得到的输出是:
2 6 8
答案 1 :(得分:0)
在您的for循环中。
假定值1删除时的值。
并且数组ary中的{是{2,3,6,7,9,5,8}
但是我的值是1,所以您没有检查值2是奇数。
因此修复循环检查所有值。
答案 2 :(得分:0)
可能会要求您显示偶数元素,而不是将其删除。 您实际上不能从纯数组中删除元素。但是,您可以做的是将偶数元素从较高的索引复制到较低的索引,并返回偶数的数目:
之前:1 2 3 4
;大小为4
之后:2 4 3 4
;新的“大小”为2
(实际大小仍为4
)
您的函数称为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};
将创建array
为vector<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
仔细检查一下,如果还有其他问题,请告诉我。