Zadanie z podstaw C++.Jak wypisać ciągi liczb parzystych z tablicy.

0

Cześć, mam problem z jednym zadaniem a za tydzień mam kolosa. Chciałbym je zrobić ale brak mi pomysłu. Przyda się każda podpowiedź, naprowadzenie na rozwiązanie zadanka.
Treść:
Napisać program tworzący dynamicznie N – elementową tablicę liczb całkowitych, gdzie N > 0
jest liczbą całkowitą podaną przez użytkownika. Wartości tablicy są podawane przez użytkownika,
a następnie wypisywane. Program ma wypisać wszystkie takie ciągi kolejnych elementów tej
tablicy, których długość przekracza M oraz wszystkie elementy w ciągu są liczbami parzystymi. M
jest liczbą całkowitą dodatnią podaną przez użytkownika. Bierzemy pod uwagę tylko ciągi
nierozszerzalne, tzn. takie, że nie możemy ich rozszerzyć o liczbę parzystą „ani z lewej ani z prawej
strony ciągu”. Np. w ciągu 1 2 4 6 5 nierozszerzalny ciąg kolejnych liczb parzystych to 2 4 6 , ciągi
2 4 i 4 6 byłyby rozszerzalne. Jeśli w tablicy nie ma ciągów spełniających te warunki, program
zwraca informację: „Brak takich ciągów.”.
Przykład: N = 13, M = 2; tablica: 2 3 4 6 8 3 8 6 3 0 2 10 4; odpowiedź: 4 6 8, 0 2 10 4

Napisałem początek kodu ale nie mam pomysłu jak zabrać się za te ciągi nierozszerzalne. Za pomoc z góry dziękuję.

#include<iostream>

using namespace std;
int main()
{

int N;
cout<<"Podaj liczbe N: "<<endl;
cin>>N;
int * tab= new int[N];
for(int i=0; i<N; i++)
{
    cout<<"Podaj "<<i+1<<" element tablicy."<<endl;
    cin>>tab[i];
}

for(int i=0; i<N; i++)
{
    cout<<tab[i]<<" ";
}

int M;

cout<<"Podaj liczbe M."<<endl;
cin>>M;



    return 0;
}
1

A na kartce wiesz jak to zrobić? Umiesz sobie rozpisać to na jakieś kroki?

0

Najpierw myślałem żeby wyszukać ciągi liczb parzystych, potem sprawdzić czy są większe od M i je wypisać

0

No brzmi jak coś co trzeba zrobić. To w czym dokładnie masz problem? Może spróbuj to napisać a potem się zobaczy co jest nie tak.

0

Tylko nie wiem za bardzo jak to napisać, to znaczy jak wyznaczyć te ciągi parzyste z szeregu liczb

0

A jakbyś to zrobił na kartce? Pewnie szedłbyś po kolei, patrzył czy liczba jest parzysta, jeśli tak to zapisywał ją na boku i tak aż do napotkania liczby nieparzystej. Potem byś sprawdzał ile ich naliczyłeś i jeśli > M to byś wypisał wszystkie te liczby. Użyj sobie jakiejś drugiej tablicy do zapisywania tych podciągów.

0

Dzięki :)

1
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;

int main()
{
    vector<int> sequence { 2, 3, 4, 6, 8, 3, 8, 6, 3, 0, 2, 10, 4, 1, 13, 7, 4, 4, 2, 6, 8 };
    vector<int> subsequence;
    int M {2};

    sequence.push_back(3);
    for( const auto &number : sequence )
    {
        if( number%2 == 0 )
        {
            subsequence.push_back(number);
        }
        else
        {
            if( subsequence.size()>M )
            {
                copy( subsequence.cbegin() , subsequence.cend() , ostream_iterator<int>(cout, " ") );
                cout << "\n" ;
            }
            subsequence.clear();
        }
    }

    return 0;
}
0

Bez też użycia dodatkowej tablicy też nie jest trudne.

static inline bool is_even(int n) {
    return (n % 2) == 0;
}

static inline void print_slice(int *begin, int *end) {
    ostream_iterator<int> cout_it(cout, ", ");
    copy(begin, end, cout_it);
    cout << endl;
}
size_t start = 0, end = start + 1;
for ( ; end < N; end++) {
    if (!is_even(tab[end-1])) {
        if (end - start > M) {
            print_slice(tab + start, tab + end - 1);
        }
        start = end;
    }
}
if (end - start >= M) {
    print_slice(tab + start, tab + end);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1