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

Bardzo Duże Liczby C++

VPS Starter Arubacloud
0 głosów
1,894 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez Kenzy Obywatel (1,160 p.)
Treść Zadanka:

Wiemy już, że każdy typ całkowity w języku C++ ma pewien ograniczony zakres. W tym zadaniu będziemy jednak operować na liczbach przekraczających zakresy wszystkich typów! Twoim zadaniem jest napisanie programu, który będzie porównywał takie bardzo duże liczby. Jak sobie z tym poradzisz?. . .  

Wejście  

Wejście składa się tylko z jednego wiersza, zawierającego kolejno: liczbę naturalną a, odstęp, znaki porównania, odstęp i liczbę naturalną b (1 ≤ a, b ≤ 101000). Możliwe znaki porównania to: ==, !=,>,< , =.  

Próbowałem pobrać zmienne jako string, "zmierzyć" je a następnie przyrównać tylko za cholerę nie mam pojęcia co zrobić gdy nie są sobie równe. Proszę o pomoc

3 odpowiedzi

+1 głos
odpowiedź 28 marca 2017 przez Aisekai Nałogowiec (42,190 p.)
wybrane 29 marca 2017 przez Kenzy
 
Najlepsza
Pobierz je jako string, obetnij nieznaczące zera (no chyba że zakładasz że nie można wprowadzić liczby 00000001 tylko trzeba 1) i potem porównujesz cyfry, jeżeli moduł liczb jest równej długości (nie mówię tutaj o znaku liczby). Robisz tak do czasu aż nie dojdziesz do ostatniej cyfry. Jeżeli któreś cyfry na i-tej pozycji będą się różnić to liczby nie będą równe (któraś będzie większa) jeżeli każda liczba bez znaku będzie tak samo długa to porównaj znaki, jeżeli będą takie same to są równe. Jeżeli różne, któraś jest większa a któraś jest mniejsza.

Jeżeli nie rozumiesz tego co napisałem to pytaj.
komentarz 28 marca 2017 przez Kenzy Obywatel (1,160 p.)
Nie rozumiem jak mogę porównywać te liczby? Zakładając że jedna cyfra to string a, druga to string b. No i jak mogę porównać np. piątą liczbę ze stringu a do stringu b?
komentarz 28 marca 2017 przez Aisekai Nałogowiec (42,190 p.)
Załóżmy że masz dwa stringi przedstawiające liczbę. Załóżmy że są one równej długości. Np 12345 i 12435.

-Sprawdzamy czy są tej samej długości: są, więc idziemy dalej.

-Sprawdzamy po kolei każde char (reprezentujące cyfry) zaczynając od tych najbardziej znaczących. Np sprawdzamy 1 z pierwszej liczby i 1 z drugiej. Są równe więc sprawdzamy kolejne. Potem mamy 2 i 2. Jest taka sama sytuacja. I dochodzimy do miejsca gdzie w pierwszej liczbie mamy 3 a w drugiej 4. Wiedząc, że są one równej długości (liczby, nie mówię na razie o liczbach zmiennoprzecinkowych, bo tutaj trzeba byłoby zrobić podobnie, tylko jak już byś sprawdził że wartości całkowite liczb są takie same musiałbyś posprawdzac która liczba ma największą cyfrę najbardziej znaczącą) więc druga jest większa. Jeżeli jedna byłaby krótsza od drugiej np 1234 i 12345 to w tym wypadku druga liczba (długość 5) jest większa od pierwszej (długość 4). Oczywiście trochę inaczej jest jak masz różne znaki, albo obie ujemne. W przypadku obu ujemnych, byłoby analogicznie tylko krótsza liczba jest większa i mniejsza cyfra musiałaby być jeżeli są takiej samej długości.
komentarz 28 marca 2017 przez Kenzy Obywatel (1,160 p.)
A w jaki sposób mogę to charem sprawdzać? Przepraszam że tak męczę i zadaję zapewne podstawowe pytania, dopiero się uczę i niewiele umiem.
komentarz 28 marca 2017 przez Aisekai Nałogowiec (42,190 p.)
W jakim języku? W javie masz np . jakisString.charAt(); w c++ stringi to są tablice charow, więc chyba jako normalne odwołanie do elementu tablicy np: char z = string[0] ale mogę się mylić
komentarz 29 marca 2017 przez Aisekai Nałogowiec (42,190 p.)
W sumie. Jak masz liczby różnych znaków, to od razu możesz powiedzieć która z nich jest mniejsza a która większa.
komentarz 29 marca 2017 przez Kenzy Obywatel (1,160 p.)
Próbuję coś z tym stringiem i charem, niby działa ale jakoś mi nie idzie. O jakim sposobie mowisz (z ostatniego komentarza?)
komentarz 29 marca 2017 przez Kenzy Obywatel (1,160 p.)
Udało się, dziękuję bardzo za pomoc :)
komentarz 29 marca 2017 przez Aisekai Nałogowiec (42,190 p.)
Spoko, dopiero teraz zobaczyłem odpowiedź na post z pytaniem, ale już chyba zrozumiałeś o co chodzi. Ew, jak sobie teraz patrzę na odpowiedzi to zwykły (w javie jest taka metoda) equals powinien załatwić sprawę, bo jeśli liczby będą takie same to powinno zwrócić prawdę, jeżeli są różne to zwróci wartość różnicy charów na "i-tej" pozycji (gdzie i-ta pozycja to jest pozycja na której się różnią),
+1 głos
odpowiedź 29 marca 2017 przez mokrowski Mędrzec (155,460 p.)
edycja 29 marca 2017 przez mokrowski

W predykatach masz odpowiednie porównania (pierwsze funkcje):


#include <iostream>
#include <string>
#include <cstdlib>
#include <functional>
#include <unordered_map>
#include <tuple>

using evaluator_t = std::function<bool(const std::string&, const std::string&)>;
using values_t = std::tuple<const std::string, const std::string, const std::string>;

// Predicates.. 
bool valuesEqual(const std::string& val1, const std::string& val2) {
    return val1 == val2;
}

bool valuesNotEqual(const std::string& val1, const std::string& val2) {
    return ! valuesEqual(val1, val2);
}

bool valuesGreather(const std::string& val1, const std::string& val2) {
    return (val1.size() > val2.size()) || (val1 > val2);
}

bool valuesLower(const std::string& val1, const std::string& val2) {
    return (!valuesGreather(val1, val2)) && valuesNotEqual(val1, val2);
}

bool valuesGreatherEqual(const std::string& val1, const std::string& val2) {
    return valuesGreather(val1, val2) || valuesEqual(val1, val2);
}

bool valuesLowerEqual(const std::string& val1, const std::string& val2) {
    return valuesLower(val1, val2) || valuesEqual(val1, val2);
}

values_t readValues() {
    std::string value1;
    std::string value2;
    std::string oper;
    std::cin >> value1 >> oper >> value2;
    return values_t(value1, oper, value2);
}

bool evaluate(values_t& values) {
    static const std::unordered_map<std::string, evaluator_t> evaluator_map = {
        {"==", valuesEqual}, {"!=", valuesNotEqual},
        {">", valuesGreather}, {"<", valuesLower},
        {">=", valuesGreatherEqual}, {"<=", valuesLowerEqual}
    };
    auto itFunction = evaluator_map.find(std::get<1>(values));

    if(itFunction == evaluator_map.cend()) {
        std::cerr << "Nie przewidziano takiego operatora.\n";
        return false;
    }

    return itFunction->second(std::get<0>(values), std::get<2>(values));
}

int main() {

    auto values = readValues();
    std::cout << (evaluate(values) ? "PRAWDA" : "FAŁSZ") << '\n';

    return EXIT_SUCCESS;
}

 

0 głosów
odpowiedź 28 marca 2017 przez marcinconn Obywatel (1,560 p.)
dobrze kombinujesz ze stringiem. Ja bym porównywał kolejne cyfry tej liczby jako fragmenty stringów

Podobne pytania

0 głosów
2 odpowiedzi 859 wizyt
pytanie zadane 9 maja 2018 w C i C++ przez koniak20 Początkujący (390 p.)
0 głosów
2 odpowiedzi 5,837 wizyt
pytanie zadane 8 lutego 2017 w C i C++ przez maciek061 Gaduła (4,490 p.)
0 głosów
1 odpowiedź 1,213 wizyt
pytanie zadane 9 kwietnia 2017 w C i C++ przez maciek259 Nowicjusz (240 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...