Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
MeghaNik
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 5
1

Смещение членов массива

28.08.2011, 22:23. Просмотров 1255. Ответов 6
Метки нет (Все метки)

В общем задача: нужно найти все простые числа в динамическом массиве, удалить их, сместить оставшиеся элементы на 1 позицию влево от удаляемого элемента, а освобождающиеся элементы в конце массива заполнить нулями. Например, если начальный массив 4, 7, 12, 3, 56, то результатом должен быть массив 4, 12, 56, 0, 0.
Так вот, нужно составить алгоритм. Нахождение простых чисел я уже сделал, а вот смещение вместе с удалением не получается.
Прикрепил блок-схему. Нужно чтобы при нахождении первого простого элемента действовало "Vect[i] = Vect[i + 1]" для всех. Как это сделать не пойму.
0
Вложения
Тип файла: docx Простые числа в массиве.docx (75.6 Кб, 18 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2011, 22:23
Ответы с готовыми решениями:

Смещение элементов одномерного массива
Осуществить сжатие массива А(30), удалив из него все положительные элементы.

Найти сумму первых 20 и 10 членов массива
С помощью датчика случайных чисел сформировать два массива X и Y размерностью 100 и 200 чисел в...

Найти максимальный из отрицательных членов массива
Найти максимальный из отрицательных членов массива с четными номерами (с учетом того, что их может...

Инициализация массива структур и форматированный вывод значений её членов
Я написал маленькую программу инициализации массива структур и форматированного вывода значений её...

найти сумму 10-ти членов следующих общих членов,которые даны снизу
найти сумму 10-ти членов следующих общих членов,которые даны снизу {a}_{n}={n}^{3}{e}^{n}

6
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
28.08.2011, 22:45 2
нули внутри списка чисел встречаться могут?
0
rangerx
1954 / 1563 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
28.08.2011, 22:53 3
std::remove_if - для удаления
std::fill - для заполнения нулями

Добавлено через 1 минуту
Ну, или реализацию посмотри, там же по ссылкам.
0
MeghaNik
0 / 0 / 0
Регистрация: 07.08.2011
Сообщений: 5
28.08.2011, 23:25  [ТС] 4
Paporotnik, внутри - нет. "0" - это простое число.

rangerx, код - это хорошо, но мне нужен алгоритм.
0
Илларион
8 / 8 / 0
Регистрация: 05.06.2011
Сообщений: 97
28.08.2011, 23:30 5
Ну у меня есть мысль делать все по очереди.
1). Пока есть простое число делаем обход массива
Если найдено прост. число, ставим vect[i] = vect[i+1] и все значения дальше до конца. vect[sizeof(vect)-j] приравниваем к нулю. j - количество проходов массива
0
OstapBender
587 / 525 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
28.08.2011, 23:38 6
если с++, тогда std::stable_partition + std::fill

MeghaNik, такие задачи в стиле С решать очень легко с помощью дополнительного массива.
копируйте туда простые числа, остаток заполните нулями.
по необходимости скопируйте новый массив на место старого (плохо).
0
rangerx
1954 / 1563 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
29.08.2011, 01:46 7
Цитата Сообщение от MeghaNik Посмотреть сообщение
rangerx, код - это хорошо, но мне нужен алгоритм.
Ну, так что ты не можешь пару строк кода разобрать и составить алгоритм? Например, удаляем чётные
f - first
r - result

Бежим указателем f от начала до конца массива. Если элемент на который указывает f нечётный, то записываем по адресу r значение того на что указывает f, и перемещаем r одну позицию вперёд. И так до конца.
Код
1) 2 5 3 4 1 
   f  
   r

2) 2 5 3 4 1
     f
   r

3) 5 5 3 4 1
       f
     r   

4) 5 3 3 4 1
         f
       r  

5) 5 3 3 4 1
           f
       r   

6) 5 3 1 4 1
             f
         r
Остались нечётные: 5 3 1
теперь от r и до самого конца всё можно заполнить нулями.
Пример(максимально простой, без указателей)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
#define N 5
 
int main()
{
    int a[N] = { 2, 5, 3, 4, 1 };
 
    int i = 0;
    int r = 0;
 
    // удаляем чётные
    while(i != N)
    {
        if( (a[i] % 2) == 1 )
        {
            a[r] = a[i];
            ++r;
        }
        ++i;
    }
 
    // заполняем нулями освободившиеся позиции
    for(i = r; i < N; ++i)
        a[i] = 0;
 
 
    for(i = 0; i < N; ++i)
        printf("%d ", a[i]);
    putchar('\n');
 
    return 0;
}
0
29.08.2011, 01:46
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2011, 01:46

найти сумму 10-ти членов следующих общих членов,которые даны снизу
Найти сумму 10-ти членов следующих общих членов,которые даны снизу. {a}_{n} = {n}^{3}{e}^{-n}

Найти min число только из простых чисел - членов массива
Дан динамический массив из n целых чисел. Найти min число только из простых чисел - членов массива.

Заменить значения членов массива на значение одной из элементарных функций
Заменить значения членов массива на значение одной из элементарных функций, аргумент которой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.