• 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,245 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,527 wizyt
0 głosów
0 odpowiedzi 109 wizyt
0 głosów
1 odpowiedź 341 wizyt

93,173 zapytań

142,184 odpowiedzi

321,967 komentarzy

62,501 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1157p. - dia-Chann
  2. 1139p. - Łukasz Piwowar
  3. 1131p. - CC PL
  4. 1126p. - Łukasz Eckert
  5. 1118p. - Tomasz Bielak
  6. 1104p. - Michal Drewniak
  7. 1083p. - Marcin Putra
  8. 1078p. - rucin93
  9. 1071p. - rafalszastok
  10. 1054p. - Adrian Wieprzkowicz
  11. 1047p. - Piotr Aleksandrowicz
  12. 1037p. - Michał Telesz
  13. 1005p. - ssynowiec
  14. 992p. - Dominik Łempicki (kapitan)
  15. 968p. - Anonim 3619784
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!

...