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

"Liczby specjalne"

Object Storage Arubacloud
0 głosów
273 wizyt
pytanie zadane 23 marca 2017 w C i C++ przez Undisputed Gaduła (3,040 p.)

Witam.

Mam problem z tym zadaniem Treść zadania

Mój kod:

#include <iostream>

using namespace std;

int main()
{
    long long N,licznik=0;
    cin >> N;
    if(N>=1)
    {
        for(int i=0; i<=N; i=i+17)
        {
            if(i%10==7)
                licznik++;
        }
    }
    cout << licznik;
    return 0;
}

Jednak limit czasu jest przekroczony - tu jest problem, nie wiem jak go rozwiązać.

Za wszelkie wskazówki, porady będę wdzięczny.

3 odpowiedzi

0 głosów
odpowiedź 23 marca 2017 przez event15 Szeryf (93,790 p.)
w wymaganiach jest 10^18 więc o ile pamiętam to jest 1 000 000 000 000 000 000. Nie dziw że przekracza czas jeśli tak to robisz.
komentarz 23 marca 2017 przez Undisputed Gaduła (3,040 p.)
Masz jakiś pomysł jak to inaczej zrobić?
0 głosów
odpowiedź 23 marca 2017 przez 10kw10 Pasjonat (22,880 p.)

1 <= N <=10^18 - Polecam uzyc tablicy char

Cecha podzielności przez 17

Cyfrę jedności pomnóż przez 5 i odejmij od liczby utworzonej z pozostałych cyfr.Jeżeli wynik dzieli się przez 17 lub jest zerem to liczba początkowa jest podzielna przez 17.(wynik może być ujemny)

Przykład:Dla 123 mamy 12-15=-3 a więc liczba 123 nie jest podzielna przez 17

Petla mozesz zaczac juz od 17, zaoszczedzisz troche czasu.

komentarz 23 marca 2017 przez Undisputed Gaduła (3,040 p.)
Czy to na pewno szybszy sposób ?
komentarz 23 marca 2017 przez 10kw10 Pasjonat (22,880 p.)
#include <iostream>
int funkcja(long long n,long long &licz,long long i)
{
    if(i<n)
    {
        if(i%10==7)++licz;
        funkcja(n,licz,i+17);
    }
    return licz;
}
int main()
{
    long long N,licznik=0,i=17;
    std::cin >> N;
    std::cout << funkcja(N,licznik,i);
    return 0;
}

Powinno dzialac

0 głosów
odpowiedź 24 marca 2017 przez mokrowski Mędrzec (155,460 p.)
edycja 24 marca 2017 przez mokrowski

Powinno być całkiem szybko. Przerobienie na ew. odpowiedź do zadania to już Twoja sprawa :-)


#include <iostream>
#include <string>
#include <numeric>
#include <algorithm>
#include <iterator>
#include <sstream>
#include <set>

// Mały Bonus... jak będziesz chciał wyjść poza zakres POD'ów 
// i uzyskać 100% punktacji, ta funkcja może być punktem startu...
bool check17DivideEnded7(const std::string& value) {
    // Sprawdzenie czy kończy się na 7. Od razu obliczenie do 
    // sprawdzenia warunku podzielności przez 17'cie.
    int lastValue = (*value.crbegin() - '0') * 5;
    if(35 != lastValue) {
        return false;
    }
    // Sumuje cyfry reprezentowane w string'u bez ostatniej.
    int sum = std::accumulate(value.cbegin(), value.cend() - 1, '0',
            [](char a, char b) {
                return a + b - '0';
    }) - '0' - lastValue;

    return ! (sum % 17 % 10);
}

std::set<int> findValues(int value) {
    constexpr static int gcd17and7 = 17 * 7;
    std::set<int> values;
    int computeValue;
    int i = 0;
    int correctionTable[] = {1, 4, 7, 0, 3, 6, 9, 2, 5, 8};

    while((computeValue = (i * gcd17and7 + correctionTable[i % 10] * 17)) < value) {
        ++i;
        values.insert(computeValue);
    }

    return values; 
}

void showSet(const std::set<int>& values) {
    std::copy(values.cbegin(), values.cend(),
            std::ostream_iterator<int>(std::cout, ", "));
}

int main() {
    int value;
    std::cout << "Podaj liczbę: ";
    std::cin >> value;

    auto values = findValues(value);
    std::cout << "Poniżej tej wartości jest " << values.size()
        << " liczb spełniających krtreria.\n";
    std::cout << "Są to: ";
    showSet(values);
    std::cout << std::endl;
}
komentarz 24 marca 2017 przez Undisputed Gaduła (3,040 p.)
Dziękuję pięknie :)

Na pewno przejrzę kod, ale nie oddam go jako mój, żeby mieć zadanie zaliczone, to nie jest mój poziom (mam nadzieję, że jeszcze nie...).
komentarz 24 marca 2017 przez mokrowski Mędrzec (155,460 p.)
Oczywiście że nie oddawaj jako swój! Nie po to go pisałem i dlatego nie trzymałem się ściśle wymagań zadania. Masz tu zastosowanie zbioru do usunięcia duplikatów, tablicę ze współczynnikami która pozwala zejść do dość niskiej złożoności obliczeniowej (ale nie teoretycznie osiągalnej) oraz stosowanie algorytmów wraz z iteratorami.

(zdradzę że w zadaniu wcale nie należy szukać tych liczb tylko znaleźć formułę obliczeń ile ich jest).

Podobne pytania

0 głosów
1 odpowiedź 438 wizyt
pytanie zadane 21 stycznia 2022 w C i C++ przez Ruthenium Nowicjusz (120 p.)
0 głosów
1 odpowiedź 526 wizyt
pytanie zadane 7 stycznia 2021 w C i C++ przez Bartek030 Obywatel (1,460 p.)
0 głosów
1 odpowiedź 214 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...