• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ciąg Farey'a - błąd wyznaczania

Object Storage Arubacloud
0 głosów
261 wizyt
pytanie zadane 30 listopada 2022 w C i C++ przez Author[] Gaduła (3,130 p.)

Cześć wszystkim! Podjąłem się wykonania zadania wyznaczenia ciągu Faray'a w ramach zadania ze strony szkopul.edu.pl. Link do zadania: https://szkopul.edu.pl/problemset/problem/XCivS2hfBhDPLj18nL8SJT2f/site/?key=statement .

Niestety przy sprawdzaniu pokazuje błąd (30% poprawnych). Nie rozumiem co robię nie tak. Dokonałem wielu testów na liczbach od 0 do 25 i nie znalazłem błędu. 

#include <iostream>
#include <vector>

int main(){
    int n{ 0 };
    std::cin >> n;

    std::vector<int>lastIndex;

    lastIndex.push_back(0);
    lastIndex.push_back(1);
    for (int i = 2; i <= n; i++)
        lastIndex.push_back(1);

    std::cout << "0/1" << " ";

    bool isDone = false;
    // i/x
    while (isDone == false) {
        for (int x = n; x > 1; x--) {
            int newLastIndex{ lastIndex[x] };
            for (int i = lastIndex[x]; i < x; i++) {
                if (x!= n && (static_cast<long double>(i) / static_cast<long double>(x)) > (static_cast<long double>(lastIndex[n]) / static_cast<long double>(n))){
                    goto next;
                }
                else if((static_cast<long double>(i) / static_cast<long double>(x)) > (static_cast<long double>(lastIndex[(x-1)]) / static_cast<long double>(x-1))) {
                    goto next;
                }

                if ((x % i != 0 || i == 1)) {
                    std::cout << i << "/" << x << " ";
                }
                newLastIndex++;
            }
            next:
            lastIndex[x] = newLastIndex;
        }

        isDone = true;

        for (int i = 2; i <= n; i++) {
            if (lastIndex[i] != i)
                isDone = false;
        }
    }

    std::cout << "1/1" << " ";

    return 0;
}

Z góry dziękuję za wszelkie sugestie smiley.

2 odpowiedzi

+1 głos
odpowiedź 30 listopada 2022 przez toko Dyskutant (7,670 p.)
wybrane 26 grudnia 2022 przez Author[]
 
Najlepsza

Masz tutaj odpowiedzi Twojego programu i mojego, który wszedł na 100 pkt. Porównaj je sobie, jest trochę różnic LINKpop.txt to mój program, res.txt to Twój, każda linia to następne wywołanie programu od n=3 do 1000

0 głosów
odpowiedź 30 listopada 2022 przez Great Stary wyjadacz (12,360 p.)

Dla n = 7 masz błędny wynik:

0/1 1/7 1/6 1/5 1/4 2/7 2/5 1/3 3/7 1/2 4/7 3/5 2/3 4/6 5/7 3/4 4/5 5/6 6/7 1/1 
0/1 1/7 1/6 1/5 1/4 2/7 1/3 2/5 3/7 1/2 4/7 3/5 2/3     5/7 3/4 4/5 5/6 6/7 1/1

1/3 < 2/5
4/6 = 2/3


Porównaj ułamki bez konwersji do long double (strata dokładności wyniku). Staraj się nie używać goto. Przerwij pętlę instrukcją break.

komentarz 30 listopada 2022 przez Author[] Gaduła (3,130 p.)
edycja 30 listopada 2022 przez Author[]
Wówczas dochodzi do automatycznej nieplanowanej konwersji typów na tym int. Zwiększa to jeszcze bardziej niedokładność.

PS: Masz rację, nie wiem jak mi te 4/6 uciekły :)

Podobne pytania

0 głosów
1 odpowiedź 255 wizyt
pytanie zadane 18 grudnia 2022 w C i C++ przez polandonion Mądrala (7,040 p.)
0 głosów
1 odpowiedź 362 wizyt
pytanie zadane 22 grudnia 2021 w Algorytmy przez Hans Nowicjusz (150 p.)
0 głosów
3 odpowiedzi 669 wizyt
pytanie zadane 6 października 2021 w C i C++ przez polandonion Mądrala (7,040 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...