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

podzielność przez 2 i 8 długich liczb

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
2,253 wizyt
pytanie zadane 12 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Czy liczbę, która ma 250 cyfr można umieścić w zmiennej typu long long czy nie bardzo? W sumie ona mieści 9223372036854775807 więc logicznie nie, ale czy jest jakiś sposób na to? Mam taki oto program, który pobiera liczbę nawet 250-cyfrową i sprawdza, czy jest podzielna przez 2 i 8.

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

int main()
{
    fstream plik;
    plik.open("liczby.txt", ios::in);

    long long liczba;
    int dodatkowa1;
    int dodatkowa2;
    int podzielna_na_dwa = 0;
    int podzielna_na_osiem = 0;

    while(!plik.eof())
    {
        plik >> liczba;
        dodatkowa1 = liczba % 2;
        dodatkowa2 = liczba % 8;
        if(dodatkowa1 == 0)
        {
            podzielna_na_dwa++;
        }
        else if(dodatkowa2 == 0)
        {
            podzielna_na_osiem++;
        }
    }
    plik.close();

    cout << "Liczb podzielnych przez dwa jest: " << podzielna_na_dwa << endl;
    cout << "Liczb podzielnych przez osiem jest: " << podzielna_na_osiem << endl;

    return 0;
}

I problem z programem polega na tym, że cały czas czarny ekran i migający kursor. Przypuszczam, że to z tego powodu, bo liczba 250 cyfrowa nie mieści się w podanym zakresie.

1 odpowiedź

+1 głos
odpowiedź 12 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 12 maja 2016 przez Evelek
 
Najlepsza
Przy operacjach na długich liczbach używa się ciągów znaków i na nich się wszystko wykonuje.

Np. dodawanie można zaimplementować na podstawie algorytmu dodawania pisemnego - reszta analogicznie.
komentarz 12 maja 2016 przez Evelek Nałogowiec (28,960 p.)

Czyli lepiej jak np. wczytam liczbę z pliku tekstowego jako 'string', a następnie sprawdzę jej ostatnie cyfry i z podzielności będzie, że:

  • podzielna przez 2, gdy ostatnia cyfra to 0,2,4,6,8
  • podzielna przez 8, gdy ostatnie trzy cyfry są podzielne przez 8

Poprawne rozwiązanie?

komentarz 12 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)

Na podzielności przez 2 i 8 się nie znam, ale jeśli są takie kryteria, a nie inne, to tak.

Jak sam widzisz, przy drugim warunku, warto ostatnie trzy cyfry przekonwertować na zwykłą liczbę i dopiero na niej wykonywać obliczenia, np. za pomocą funkcji std::stoi.

komentarz 12 maja 2016 przez Evelek Nałogowiec (28,960 p.)

To ja to zrobiłem w taki sposób teraz i nie liczy mi, a wszystko wydaje się być poprawnie.

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

int main()
{
    fstream plik;
    plik.open("liczby.txt", ios::in);

    string dane;
    char ostatnia_cyfra;
    char przedostatnia_cyfra;
    char przedprzedostatnia_cyfra;
    int podzielna_na_osiem = 0;
    int podzielna_na_dwa = 0;

    while(!plik.eof())
    {
        plik >> dane;
        ostatnia_cyfra = dane[dane.length()-1];
        przedostatnia_cyfra = dane[dane.length()-2];
        przedprzedostatnia_cyfra = dane[dane.length()-3];

        if(ostatnia_cyfra == 0 && przedostatnia_cyfra == 0 && przedprzedostatnia_cyfra == 0)
        {
            podzielna_na_osiem++;
        }
    }
    plik.close();

        cout << "Liczb podzielnych przez dwa jest: " << podzielna_na_dwa << endl;
        cout << "Liczb podzielnych przez osiem jest: " << podzielna_na_osiem << endl;

    return 0;
}

Warunek if wydaje się być napisany poprawnie, sprawdzam tutaj czy trzy ostatnie cyfry w tej liczbie to 0, bo wtedy jest podzielna przez 8. Liczby z pliku tekstowego są zapisane w systemie dwójkowym, więc potrzeba tylko ten jeden warunek sprawdzić, aby trzy ostatnie cyfry były zerami.

komentarz 12 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)

Reguły podzielności są podawane dla systemu dziesiętnego wink

komentarz 12 maja 2016 przez Evelek Nałogowiec (28,960 p.)
Ale to nie ma tutaj znaczenia, sprawdzam czy liczba binarna (czyli w systemie dwójkowym) sama w sobie jest podzielna przez 8, a nie czy zamiana liczby binarnej na system dziesiętny będzie podzielna przez 8.

Mam w pliku tekstowym 1000 liczb naturalnych zapisanych w systemie dwójkowym i to wśród nich muszę znaleźć te, których trzy ostatnie cyfry to zero, bo wtedy będzie dana liczba podzielna przez 8.

I cały czas chodzi o ten ostatni kod programu co wysłałem, bo według mnie jest wszystko poprawnie opisane, a cały czas nie chce mi liczyć, ile tych liczb jest co są podzielne przez 8.
komentarz 12 maja 2016 przez Evelek Nałogowiec (28,960 p.)
Ogarnąłem to już. Brakowało --> ' przy cyferkach 0, w końcu to char.

Podobne pytania

0 głosów
1 odpowiedź 2,551 wizyt
0 głosów
0 odpowiedzi 110 wizyt
0 głosów
1 odpowiedź 343 wizyt

93,194 zapytań

142,206 odpowiedzi

322,051 komentarzy

62,519 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 3053p. - dia-Chann
  2. 2998p. - Łukasz Piwowar
  3. 2993p. - Łukasz Eckert
  4. 2970p. - CC PL
  5. 2930p. - Tomasz Bielak
  6. 2907p. - Łukasz Siedlecki
  7. 2890p. - rucin93
  8. 2801p. - Adrian Wieprzkowicz
  9. 2645p. - Mikbac
  10. 2485p. - Marcin Putra
  11. 2461p. - Michał Telesz
  12. 2418p. - Michal Drewniak
  13. 2156p. - Anonim 3619784
  14. 1733p. - rafalszastok
  15. 1650p. - Mariusz Fornal
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...