Wyświetlanie składowych liczby w dowolnej kolejności

0

Witajcie

W zadaniu użytkownik podaje dowolną liczbę całkowitą, dodatnią, a program ma za zadanie dla cyfr 0,1,2 wyświetlić napis "NIE" natomiast dla pozostałych wypisać składowe w dowolnej kolejności, ale tak, żeby n i n+1 były od siebie różne o więcej niż 1.
Nie mam pomysłu jak ugryźć to wypisanie kolejnych składowych. Przypomina to silnie, ale musi uwzględniać również 0. Myślałam o dzieleniu z resztą i bez reszty i odpowiednich kombinacjach ale wtedy mam problem ze zmiennymi do przechowywania bo musiałyby się tworzyć dynamicznie :/
Jest to z pewnością mega proste ale nie umiem znaleźć rozwiązania :/

Dotąd mój kod wygląda tak

#include <iostream>

using namespace std;

int main()
{
    int liczba,i;
    cout << "Podaj liczbe" << endl;
    cin >> liczba;

    if (liczba == 0 || liczba==1 || liczba==2)
    {
        cout << "NIE"<<endl;
    }
    else
    /*for (i=liczba;i<=liczba && i>=0;i--) // pętla, na którą nie mam pomysłu
    {

        cout << liczba << endl;
    }
    */
    for (i=0;i<liczba;i++)
    {
        if (((i-1)-i) !=1)
        {
            cout << liczba << endl;
        }
    }
    return 0;
}

Oczywiście teraz te pętle są pod sobą ale to tylko tak "roboczo" żeby sprawdzić czy ta druga nie generuje jakiegoś błędu składni.

0

@Sandra składowe? masz na myśli czynniki pierwsze? Rozpisz Twój algorytm bez kodu, zweryfikujemy czy to ma sen, a potem możemy ewentualnie pomóc z kodem

0

Myślałam o czymś takim
np. dla cyfry 4
4:2=2
2:2=1
4-1=3
1-1=0

teraz pętla, która sprawdzi różnice między kolejnymi cyframi i wypisze
1,3,0,4

ale ta pogrubiona część jest dla mnie ciężka do ubrania w kod. Pewnie jest na to prosty sposób.
Myślałam o funkcjach na dzielenie i odejmowanie i wywoływanie ich n razy (jeśli dobrze myślę to dla parzystej liczby każda funkcja byłaby wywołana n/2 razy).

0

@Sandra, nie rozumiem dlaczego najpierw dzielisz a potem odejmujesz. Dlaczego akurat tak to rozpisałaś? Zdefiniuj problem tak jakbyś babci tłumaczyła

0

Moje myślenie wyglądało mniej więcej tak:
Dla liczby dodatniej
Jeśli przedziele przez 2 bez reszty to dostanę połowę z tej liczby
Jeśli tą połowę podzielę na 2 to dostanę nieparzystą część tej liczby (dla 4, dla wyższych dzieleń będzie musiało być więcej, aż wynik będzie nieparzysty czyli pewnie pakowałabym tu warunek "do czasu aż reszta z dzielenia = 1" ale to już mod bede potrzebowala :/ ), która będzie zarówno jedną ze składowych jak i posłuży do dalszego poszukiwania składowych
Odejmując teraz tą uzyskaną nieparzystą część od siebie samej oraz pozostałych dodatnich części otrzymuje brakujące nieparzyste części i mam już komplet cyferek

1

@Sandra, wydaje mi się, że masz tutaj dwa problemy:

  • czynniki pierwsze
  • wyświetlenie wyniku, żeby spełniał warunki (różnia między kolejnymi składnikami > 1)

dzieleniem przez dwa nie policzysz czynników pierwszych. Do czynników pierwszych potrzebujesz liczby pierwsze.
Zrób najpierw pierwsza część. Wrzuć wyniki do np. vector<int> i potem myśl nad częścią 2.

1

Jeżeli rzeczywiście to mają być czynniki pierwsze, to jest tylko jedna sytuacja, gdy są od siebie odległe o 1, i @krwq, nie podpowiadaj. ;)

Przy okazji, ciekawsze byłoby, gdyby miały być odległe o więcej niż 2.

Jak w komentarzach uświadomił mi @krwq, jest tego trochę więcej. ;) Przepraszam.


Jeśli tablica z czynnikami pierwszymi będzie posortowana, możesz zrobić to tak: dodajesz naprzemiennie: liczbę pierwszą, liczbę przedostatnią, liczbę drugą, liczbę przed-przedostatnią (za każdym dodaniem sprawdzasz warunek, czy są od siebie odległe o więcej niż 1). Jeśli w końcu warunek nie będzie spełniony, to znaczy będą to liczby środkowe, sąsiadujące (równe albo odległe o 1), to wstawiasz między nie ostatnią liczbę. EDIT: A jeśli ten warunek będzie spełniony, czyli jeśli są to liczby różniące się więcej niż 1, także wstawiasz między nie tę ostatnią.

Nie wiem, na ile to dobrze działa dla tablic czynników o rozmiarze mniejszym od 6.

0

W sumie mam jeszcze wątpliwość.
Rozkład na czynniki pierwsze, o którym wspominaliście wyżej, daje mi liczby, które pomnożone przez siebie dają liczbę wejściową. A tutaj z treści zadania wynika, że mam znaleźć składowe, a więc nie
9 = 3*3 , a 9 = 9,8,7,6,5,4,3,2,1,0

Czy wobec tego nie mogłoby być tak:

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

 

int main()
{
   int liczba=0,i,n=0;
   cout << "Podaj liczbe" << endl;
    cin >> liczba;
    std::vector < int > tab;

    tab.clear();

    if (liczba!=0 && liczba!=1 && liczba!=2)
    {
        n=liczba;
        tab.push_back(n);
        std::cout << tab[n] << std::endl;

       for (i=0;i<n;i++)
    {
        tab.push_back(n);
        n=liczba-1;

    }
        for (i=0;i<tab.size();i++)
        std::cout << tab[n] << std::endl;

    }
    else
        cout << "NIE"<<endl;
        
}
}

Tylko oczywiście coś jest źle bo sypie mi liczby z kosmosu :/ ale generalnie chodzi o ten rozkład to chyba najprościej jednak odejmować w pętli i jak osiągnę 0 wymieszać liczby tak żeby nie sąsiadowały ze sobą jeśli ich różnica wynosi 1.

Bardzo proszę o sprawdzenie i ew. nakierowanie na poprawne tory

0

A nie prościej liczba / 2 (parzyste) lub liczba / 2 + 0.5 (nieparzyste) i potem 0 n 1 (n - 1) 2 (n - 2) itd? Bo z tego co widzę masz wypisać wszystkie liczby od 0 do n tak żeby było między nimi co najmniej 2 różnicy. O ile dobrze pamiętam podobne zadanie ze spoj-a, to 4 trzeba potraktować specjalnie w takim przypadku.

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



int main()
{
    int liczba=0,n=0;
                cout << "Podaj liczbe" << endl;
                cin >> liczba;
    std::vector < int > tab;

    tab.clear();

                                    if (liczba!=0 && liczba!=1 && liczba!=2)
                                    {
                                        n=liczba;

                                            for (int i=0;i<n;i++)
                                            {
                                                tab.push_back(n);
                                                n=n-1;


                                            }
                                            for (size_t i=0;i<tab.size();i++)
                                                std::cout << tab[i] << std::endl;

                                    }
                                    else
                                    cout << "NIE" <<endl;

                                                                                    for (int i=0; i<n; i++)
                                                                                    {
                                                                                        if ((tab.at[i+1])-(tab.at[i]) !=1)
                                                                                        {
                                                                                            std::cout << tab[i] << std::endl;
                                                                                        }
                                                                                    }

}



Lepsze jest to, że przynajmniej wyświetla częściowo liczbę. Jednak to nadal nie to

Tak jakby brakowało przejść, bo konsola wyrzuca początkowo dobrze np. dla 6 => 6,5,4

1

A nie prościej bez vectora?

#include <iostream>

using namespace std;

int main()
{
    int n = 0;
    cin>>n;
    if ( n < 3)
    {
        cout << "Nie";
        return 0;
    }
    if (n == 3)
    {
        cout << "1 3 0 2";
        return 0;
    }
    if (n % 2 == 0) cout << "0 " << n << " " << int(n / 2 )<< " ";
    else cout << int(n / 2) << " 0 " << n << " " << int (n / 2) + 1  << " ";
    for (int i = 1; i + i + 1 < n; i++) cout << i << " " << n - i << " ";
    return 0;
}
0

W sumie można to zrobić prościej na zasadzie parzyste / nieparzyste

#include <iostream>

using namespace std;

int main()
{
    int n = 0;
    cin>>n;
    if ( n < 3)
    {
        cout << "Nie";
        return 0;
    }
    for (int i = 1; i <=n; i += 2) cout << i << " ";
    for (int i = 0; i <=n; i += 2) cout << i << " ";
    return 0;
}

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