Дан одномерный массив. Необходимо после максимального элемента удалить все простые числа (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--;
}
}
Простые числа определяет верно, с самим процессом удаления что-то не так.
Другие языки программирования и технологии
Не пойму как удалить элементы массива (C++).
#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;
}
#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;
}
Удаление производят сдвигом массива, то бишь переписывая значение.
Ну, для простых массивов точно.
Ну, для простых массивов точно.
Дорогой мой незатейливый автор!
Вам доводилось слышать о старом добром принципе "Разделяй и властвуй"? Смею вас заверить, он прекрасно работает и в программировании.
Вот у вас собраны в кучу разнородные вещи - тест на простоту и удаление элементов. Неудивительно, что вы не можете понять, как работает ваш собственный код.
Если завести функции
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.
И вообще, чтобы понять что именно делает ваш код, умные люди давно изобрели такую штуку, как отладчик.
Советую прибегнуть к его услугам...
Вам доводилось слышать о старом добром принципе "Разделяй и властвуй"? Смею вас заверить, он прекрасно работает и в программировании.
Вот у вас собраны в кучу разнородные вещи - тест на простоту и удаление элементов. Неудивительно, что вы не можете понять, как работает ваш собственный код.
Если завести функции
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.
И вообще, чтобы понять что именно делает ваш код, умные люди давно изобрели такую штуку, как отладчик.
Советую прибегнуть к его услугам...
Похожие вопросы
- Поиск наибольшего отрицательного элемента массива (c++) и его удаление, написал программу, где то косячек =/
- Как удалить элемент массива со сдвигом остальных элементов в С++
- Как удалить нулевые элементы из массива C++. Помогите написать код для того чтобы из массива удалить все нулевые элементы
- Как из массива удалить элемент?
- Вычислить сумму элементов массива, расположенных между первым и вторым отрицательными элементами - C++
- 1.Заполнить массив случайными числами. Вывести элементы массива на экран. Заменить все его минимальные элементы нулями.
- C#. Элементы одномерного массива размером 7, которые больше среднего значения элементов массива, заменить на 0.
- Объясните пожалуйста, что означает эта строка WRITE('ВВЕДИTE ЭЛЕМЕНТ МАССИВА '); READLN(MAS[1])?
- Удалить все непростые элементы массива
- В одномерном массиве, состоящем из n вещественных элементов, вычис- лить: 39 1) сумму положительных элементов массив