Как извлечь нули из одного массива и сохранить ненулевую часть в другой массив? - PullRequest
0 голосов
/ 23 апреля 2019

Я работаю над небольшой программой о простых числах. Например, у меня есть массивы простых чисел:

array[15]={0,0,0,13,0,17,0,31,7,3,0,0,0,37,0};

Мне нужно извлечь нули из массива, затем мне нужно сохранить оставшиеся числа в другой массив (для этого случая tmp).

Я сгенерировал следующую функцию для этой операции.

Для следующего кода:

counter - количество простых чисел в массиве (для этого случая 6).

дБ - размер массива (для этого случая 15).

void function2(int array[],int counter){

     int tmp[counter];

     //takes arrayB with zeros in it, extract zeros prints new array.
        for(int a=0;a<counter;a++){

            for(int i=0;i<dB;i++){

                if(array[i]!=0 ){

                    tmp[a]=array[i];
                    break;
                }   
            }
        }
    cout<<"Prime numbers array extracted from above:\n";
    for(int b=0;b<counter;b++){
        cout<<tmp[b]<<" ";
    }   
}

Когда я выполняю этот код, он просто печатает первое простое число массива (13) для счетчиков, умноженных на (6).

13,13,13,13,13,13

Однако мне нужен следующий вывод.

13,17,31,7,3,27

Я думаю, что мой алгоритм неверен. Как я могу это исправить?

Спасибо!

Когда я изменяю оператор if следующим образом:

if(array[i]!=0 && array[a-1]!=array[i])

Я получаю следующий вывод

13,17,13,17,13,17

Нужно ли делать изменения для всех 6 элементов?

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

Подход прост, просто переберите исходный массив, который содержит 0 и простые числа, и как только вы получите ненулевое число, добавьте его в массив tmp.

Ниже приведен рефакторинг вашего кода для выполнения вышеуказанного подхода:

void function2(int array[],int counter){    
     int tmp[counter],a=0;
     for(int i=0;i<dB;i++){
                if(array[i]!=0 ){
                    tmp[a++]=array[i];
                }
            }
    cout<<"Prime numbers array extracted from above:\n";
    for(int b=0;b<counter;b++){
        cout<<tmp[b]<<" ";
    }   
}
0 голосов
/ 23 апреля 2019

Во-первых, сделайте только один цикл и выполните итерацию по всему массиву 'массив'.Если значение не равно нулю, добавьте его в свой результат и увеличьте счетчик.Когда ваш счетчик равен дБ, используйте команду break, чтобы выйти из цикла.

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

0 голосов
/ 23 апреля 2019

Вот решение: оно перебирает массив, если элемент не равен 0, он вставляется в vector.

#include <iostream>
#include <vector>
using namespace std;

int foo[15]={0,0,0,13,0,17,0,31,7,3,0,0,0,37,0};

void GetPrimesFromArray(int inputArray[], int array_size) {

    vector<int> tmp;

    for(int i = 0; i < array_size; ++i)
        if(inputArray[i]!=0)
            tmp.push_back(inputArray[i]);

    for(int i = 0; i < tmp.size(); ++i)
        cout << tmp[i] << endl;

}

int main() {
    GetPrimesFromArray(foo, 15);
}

Выходы:

13
17
31
7
3
37
...