• 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

Object Storage Arubacloud
0 głosów
1,912 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,349 wizyt
0 głosów
0 odpowiedzi 36 wizyt
0 głosów
1 odpowiedź 299 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

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

...