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

Odpowiedz Nowy wątek
2018-03-09 20:12
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.

edytowany 2x, ostatnio: furious programming, 2018-03-09 20:50

Pozostało 580 znaków

2018-03-09 20:18
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


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2018-03-09 20:23
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).

Pozostało 580 znaków

2018-03-09 20:27
0

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


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2018-03-09 20:34
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

edytowany 1x, ostatnio: Sandra, 2018-03-09 20:35

Pozostało 580 znaków

2018-03-09 20:39
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.


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2018-03-09 20:40

Pozostało 580 znaków

2018-03-09 23:04
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.

edytowany 4x, ostatnio: Silv, 2018-03-10 02:38
Pokaż pozostałe 3 komentarze
Zgoda. Dzięki. :) Myślę nad rozwiązaniem. - Silv 2018-03-09 23:12
dla dowolnego n robi się ciekawie, musiałbym pewnie na kartce sobie rozpisać - brakuje mi trochę takich typowo algorytmicznych problemów (na codzień) - krwq 2018-03-09 23:14
@krwq: jak coś, edytowałem post (nie wiem, czy w powiadomieniach są też podane edycje obserwowanych postów). - Silv 2018-03-09 23:21
z reguły z opóźnieniem dostaje powiadomienia :) - krwq 2018-03-10 02:06
Ok dziś dopiero do tego usiądę po pracy może coś w końcu wymyśle :) - Sandra 2018-03-12 09:38

Pozostało 580 znaków

2018-03-13 18:30
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

edytowany 4x, ostatnio: Sandra, 2018-03-13 23:06
Pokaż pozostałe 4 komentarze
Cieszę się, że udało Ci się rozwiązać, napisz o tym w poście; chciałbym jednak zrozumieć treść, byłbym na przyszłość mądrzejszy. - Silv 2018-03-14 23:08
Jeśli pozwolisz to rozpiszę to dokładnie o co chodziło i gdzie zrobiłam błąd w myśleniu w sobotę wieczorem. Nie mam teraz dostępu do komputera, a z telefonu strasznie niewygodnie to pisać no i nie mam kodu - Sandra 2018-03-14 23:09
Dobrze, dobrze, poczekam. ;) Nie proszę nawet o kod, wystarczy sama treść z wyjaśnieniem tego pojęcia składowych i w ogóle co tutaj liczyć. Pytam w ogóle, bo ja to taki z natury jestem niedomyślny i tak dalej. - Silv 2018-03-14 23:11
Sorki za spóźnienie. A więc tak. W zadaniu mam polecenie "Jako wejście użytkownik podaje dowolną liczbę całkowitą. Program ma za zadanie wyświetlić napis "Nie" dla cyfr z przedziału <0;2>. Dla pozostałych przypadków wyświetlić cyfry składowe w kolejności dowolnej, jednak różnica sąsiadujących ze sobą cyfr musi być większa niż jeden. " Jako jakąś wskazówkę mam podaną jak się rozpisuje silnie - że właśnie silnia obliczana jest przez mnożenie ze sobą tych kolejnych cyfr aż do cyfry, która była wejściem. Stąd też tak zasugerowałam się tą silnią i chciałam to dzielić - Sandra 2018-03-19 14:12
@Sandra: dziękuję. :) Może rzeczywiście to silnia? W każdym razie ja nie rozumiem tych składowych. - Silv 2018-03-19 14:49

Pozostało 580 znaków

2018-03-13 23:00
sig
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.

edytowany 1x, ostatnio: sig, 2018-03-13 23:01
@sig Tak, ale póki co jestem jeszcze w momencie samego wyświetlania tych składowych bo nadal jest źle. Dopiero później mogę spróbować napisać to co radzisz :) - Sandra 2018-03-13 23:05

Pozostało 580 znaków

2018-03-13 23:44
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

edytowany 1x, ostatnio: Sandra, 2018-03-13 23:47

Pozostało 580 znaków

2018-03-14 08:32
sig

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;
}
Dzięki zaraz sobie to prześledzę :) - Sandra 2018-03-14 09:38

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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