Другие языки программирования и технологии

Не пойму как удалить элементы массива (C++).

Дан одномерный массив. Необходимо после максимального элемента удалить все простые числа (nmax - порядковый номер максимального элемента, i - порядковый номер элемента массива x[i] ).

for(i=nmax+1; i<n; i++)
{
k=0;
for(j=1; j<x[i]+1; j++)
if(x[i]%j==0) k++;
if(k==2)
{
x[i]=x[i+1];
n--;
i--;
}
}

Простые числа определяет верно, с самим процессом удаления что-то не так.
#include <iostream>
#include <iomanip>
using namespace std;
void fill(unsigned* arr, const size_t size);
void sieve(unsigned* arr, const size_t size);
size_t shift(unsigned* arr, const size_t size);
void print(unsigned* arr, const size_t size);
bool is_prime(unsigned n);
void uswap(unsigned& a, unsigned& b);
int main() {
const size_t size = 100;
unsigned arr[size];
fill(arr, size);
print(arr, size);
sieve(arr, size);
size_t last = shift(arr, size);
print(arr, last);
cin.get();
}
void fill(unsigned* arr, const size_t size) {
unsigned n = 0;
for (auto p = arr; p != arr + size; ++p) *p = ++n;
}
void print(unsigned* arr, const size_t size) {
for (auto p = arr; p != arr + size; ++p) cout << setw(3) << *p << ' ';
cout << endl;
}
void sieve(unsigned* arr, const size_t size) {
for (auto p = arr; p != arr + size; ++p) if (!is_prime(*p)) *p = 0;
}
size_t shift(unsigned* arr, const size_t size) {
auto z = arr;
for (auto p = arr; p != arr + size; ++p) {
while (*z && z != arr + size) ++z;
if (!*z && *p) uswap(*z, *p);
}
return z - arr;
}
bool is_prime(unsigned n) {
bool prime;
if (n == 2 || n == 3 || n == 5) prime = true;
else if (~n & 1 || n < 2 || 0 == n % 3 || 0 == n % 5) prime = false;
else {
unsigned i;
for (i = 3; i * i <= n && n % i; i += 2);
prime = i * i > n? true : false;
}
return prime;
}
void uswap(unsigned& a, unsigned& b) {
unsigned tmp = a;
a = b;
b = tmp;
}
Владимир Гагиров
Владимир Гагиров
61 605
Лучший ответ
Удаление производят сдвигом массива, то бишь переписывая значение.
Ну, для простых массивов точно.
Дорогой мой незатейливый автор!

Вам доводилось слышать о старом добром принципе "Разделяй и властвуй"? Смею вас заверить, он прекрасно работает и в программировании.

Вот у вас собраны в кучу разнородные вещи - тест на простоту и удаление элементов. Неудивительно, что вы не можете понять, как работает ваш собственный код.

Если завести функции

is_prime( int number ) которая будет только тестировать на простоту

и

remove_element( int* array, int size, int index ) которая будет только удалять элемент массива с данным индексом

и протестировать их по отдельности

то потом цикл можно будет записать так

for ( int i = nmax; i < n; ++i )
{
if ( is_prime(x[i]) )
{
if ( remove_element(x, n, i) )
{
--n;
--i;
}
}
}

по поводу вашего теста на простоту. не совсем понятно загадочное условие if ( k == 2 ). Может быть, его нужно проверять сразу после k++ и если оно верно, делать break? Далее, делить нужно на диапазон чисел начиная с двойки (на единицу целое число делиться по любому) и до квадратного корня из тестируемого числа.

Далее, вы пишете

x[i] = x[i+1];

пораскиньте мозгами, к какому элементу x[i+1] будет обращаться программа, на последней итерации, когда i = n-1.

И вообще, чтобы понять что именно делает ваш код, умные люди давно изобрели такую штуку, как отладчик.
Советую прибегнуть к его услугам...
Дмитрий Наумов
Дмитрий Наумов
21 154

Похожие вопросы