Diskuze: Dělení a násobení velkých čísel
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Musíš si uvědomit, že primitivní typy javy mají omezenou hodnotu. Long například má pravděpodobně rozsah -9,223,372,036,854,775,808 do +9,223,372,036,854,775,807, což je hodně, ale jak říkáš, ve vyšších soustavách čísla rostou velmi rychle.
Jedna z optimalizací může být nepřevádět číslo do desítkové soustavy, což se ti hodí převážně pokud převádíš z vyšší než desítkové do vyšší než desítkové, tj. čísla budou zřejmě menší než v desítkové.
Reprezentace Stringem je úplně v pohodě. Musíš si uvědomit, že číslo jako takové nemá žádnou podobu a jeho zápis do čísla či řetězce je jen pomoc pro nás lidi.
Sčítání, odčítání je na implementaci se Stringy jednoduché. Násobení a dělení ne až tolik, ale také se s tím dá pracovat – vygoogli. Viz například https://stackoverflow.com/…-string-by-3, což není nejlepší zdroj, ale máš tam nějaké poznámky k této tématice.
Sčítání, odčítání – jedeš čísla zprava a postupně aplikuješ operaci a předáváš zbytek do vyšší pozice.
Násobení – pravděpodobně hloupá implementace by bylo to dělat tak, jak to dělají lidé, tj. zprava vynásobíš všechno prvním číslem (tím kterým násobíš) zprava, pak znova druhým číslem (tím kterým násobíš) zprava a postupně aplikovat již vytvořené sčítání atp. aby ses dočkal požadovaného výsledku.
Dělení už není tak jednoduché, ale jakmile si uvědomíš že dělení je operace, který ti řekne "kolikrát se něco vejde" a "jaký je zbytek", na nějakou implementaci přijdeš taky.
Použil bych <a href='http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html'>BigDecimal</a>
Jak se dá v tomto případě BigDecimal použít?
Nevím, jak převést např. "12A" do BigDecimal
Aha tak na tohle konkrétně bych teda použil BigInteger. BigDecimal je pro velká čísla s desetinnou čárkou, BigInteger je pro velká celá čísla, lze mezi nimi jednoduše převádět. BigInteger umí rovnou načíst hexadecimální číslo jako string, stačí mu udat v jaké soustavě to je:
String cislo = "12A";
BigInteger c = new BigInteger(cislo, 16);
//v 'c' teďka máš číslo 12A, protože jsi BigIntegeru řekl, že je to v 16kové soustavě, tak si to interně převedl a uložil podle svého
//takže mužeš pro 'převod' do jiné soustavy udělat:
System.out.println("hexadecimální číslo: " + c.toString(16) + " v decimální soustavě: " + c.toString(10));
Vypadá to, že ten BigDecimal opravdu umožňuje pojmout ohromné číslo. Hustý.
Podle tohoto https://stackoverflow.com/…6661/3281252 by to mělo jít pouhým napsáním soustavy jako druhý parametr. Je to příklad pro BigInteger, ale pro BigDecimal to půjde určo obdoběně.
Děkuji za pomoc při řešení. Funguje skvěle
Zobrazeno 8 zpráv z 8.