Výsledky 1 až 7 z 7

Téma: [JAVA] Odčítání nekonečného čísel

  1. #1

    Question [JAVA] Odčítání nekonečného čísel

    Zdravím
    Na naší elektro průmce je na všech oborech společný jeden programovaí jazyk. Nechápu, jak vedení došlo k závěru, že zrušej výuku C a přejdou na Javu (a to se máme učit programovat mikročipy)...Java jako taková mě vůbec nebaví, protože nejsem ničím motivován>je to pomalé, není to strojový kód atd.
    Kámoš z vyššího ročníku dostal za 5 (stejně jako všichni ostatní spolužáci ) a přišel za mnou, jestli bych mu pomohl s jedním příkladem díky kterému všichni propadají
    Nejde mě (nám) o to, aby tu někdo nahodil zdroják, ale spíš o pochopení algoritmu a tak. Ještě bych upozornil, že v Javě postupujeme podle kapitol v Heroutově knížce "Učebnice jazyka Java". Zvládáme tedy základy+pole+metody+řetězce a znaky. Třídy ještě ee

    PŘÍKLAD
    Program, který umí odčítat nekonečná čísla, tedy čísla uložené ve String. Máš číslo A (jenž může být nekonečné např.64641654566646168168168>to co přesahuje zakladní datové typy) a k němu odečti číslo B, které může být taky nekonečné

    Určitě vám programátorským borcům to přijde jednoduché, ale berte v úvahu, že jste taky začínaly

  2. #2
    Senior Member Avatar uživatele Peca-on-line
    Založen
    24.01.2004
    Bydliště
    Trutnov
    Věk
    38
    Příspěvky
    2 612
    Vliv
    312

    Standardní Re: [JAVA] Odčítání nekonečného čísel

    V Javě toho taky moc nesvedu, ale intuitivně bych to řešil jako když si to napíšeš pod sebe na papír, postupně řád po řádu.
    Děkovat mi kromě karmy můžete také v BTC: 1JVRVYsWRYFb9AajzoHRVnmqjgpBjYmykr

  3. #3

    Standardní Re: [JAVA] Odčítání nekonečného čísel

    No vidis a prave na takove veci je Java uzasna, psat nejakou univerzalni funkci na tohle v assembleru bych vazne nechtel. Zasadni vec: pouzi tridu, ktera je urcena pro takova cisla.. tedy BigDecimal a pak uz je to vicemene hracka.
    Kód:
    String a = "0.353453453454363463446364346364346343";
    String b = "0.435434534534534435445435435345453454";
    
    BigDecimal numa = new BigDecimal(a);
    BigDecimal numb = new BigDecimal(b);
    
    BigDecimal numc = numa.subtract(numb);
    
    System.out.println(numc);

    Fanless Experiment || Gigabyte Z77-DS3H | Intel i5-3570K | Thermalright HR-02 | 16G DDR3 | Sapphire HD 7750 Ultimate | Crucial M4 256GB | Seasonic X-400FL | Fractal Define R4
    Dell D430 || i945G | C2D 1.2G ULV | 2G DDR2 533 | GMA950 | 12" 1280x800 | 80G 4k2 | 802.3ab | 802.11g | 802.15.1 | HSDPA | Windows 7 x64
    Storage || i965G | E2200 | 4G DDR2 | RAID5 6x Samsung HD154UI 1.5TB - ~7TiB | 802.3ab ...powered by Ubuntu Server x64
    Accessories || E-MU Tracker Pre USB 2.0 | Meier Corda Headsix | Sony MDR-CD470 | Pioneer A-204R | Tesla ARS 9218 32 | LG 32LD350

    "Music is essentially useless, as life is." George Santayana


  4. #4

    Standardní Re: [JAVA] Odčítání nekonečného čísel

    Ja bych rekl, ze cilem je ten algoritmus a ne pouziti tridy


    No funguje to uprimne stejne jako registry, do nich prece taky velke cisla nedostanete a musi se to delat na vice kroku.

    Tj. nacist prvnich X mist kolik muzeme zkonvertovat na treba long (samozrejme od nejmensich radu), odecist, prilepit vysledek do vysledneho retezce, zapamatovat si prenos do vyssich radu a takhle dokola (s tim ze odecitas ten prenos).

    Jde to samo i rad po radu, ale to je celkem zbytecna zdrzovacka.

    Vyssi programovaci jazyk a princip z mikropocitacu.. a na to ani neni treba ASM ja tohle psal v mikro

    OFF:
    Prestante uz nadavat na ty programovaci jazyky, stejnak je to stale na jedno brdo. Me uz je skoro jedno v cem to pisu, jediny rozdil je ze se tyden aklimatizuju na novy jazyk ale problemy jsou stale stejne. Jen reseni jsou maximalne opticky o neco lepsi/horsi.
    Naposledy upravil mike.pr; 19.04.2009 v 16:57.

  5. #5

    Standardní Re: [JAVA] Odčítání nekonečného čísel

    Jelikoz je ten string v jave pole znaku tak bych to projizdel v cyklu od pole.length() do 0 a odecital prislusne rady s prenosem do vyssich radu.
    NTB MSI EX600, CPU Intel Core 2 Duo T5550@1,83Ghz, 2GB RAM, GF8400M-G 256MB, HDD 320GB...

  6. #6
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 738
    Vliv
    300

    Standardní Re: [JAVA] Odčítání nekonečného čísel

    Citace Původně odeslal Chuck Zobrazit příspěvek
    Jelikoz je ten string v jave pole znaku tak bych to projizdel v cyklu od pole.length() do 0 a odecital prislusne rady s prenosem do vyssich radu.
    Videl bych to podobne, nebude to mozna nejrychlejsi ani nejelegantnejsi resenni, ale ucel to asi splni.

    Princip:

    for ( int i = 0, len(b), i++) {

    int x = a[len(a - i)]
    int y = b[len(b - i)] + prenos

    int u = x - y
    int prenos = 0

    if ( u < 0) {
    prenos = 1
    u = u + 10
    }

    vysledek[i] = u

    }

    Netvrdim ze je to dobre psal sem to z hlavy a syntax neresim vubec. nekonecne velky to samozrejme byt nemuze v zadnym pripade, ale nejvetsi celociselnej typ je IMO dost velkej aby prelez kapacitu jakyhokoli dostupnyho media .

    Edit: Samo je tam treba jeste osetrit ktery z cisel je delsi a vysledek by to ukladalo pozpatku, ale to je detail.

    BTW: To ze si stim "nikdo nevi rady" taky svedci o leccems, ucili ste se vubec scitat/odcitat vetsi cisla na papire ?

    Edit2: Pokud zadani zni skutecne tak, jak je uvedeno "Program, který umí odčítat nekonečná čísla, tedy čísla uložené ve String", bylo by naprosto korektnim resenim napsat odpoved, ze zadani nema reseni. Pokud by nebyla uznana, je to na vyhazov vyucujiciho pro neschopnost.
    Naposledy upravil Jezevec; 04.05.2009 v 17:11.
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

  7. #7

    Standardní Re: [JAVA] Odčítání nekonečného čísel

    Teraz sa ucim javu z jednej knihi, tak som to zobral ako ulohu a pokusil sa tonaprogramovat s obmedzenim, ze mozes zadavat iba kladne cele cisla. Program akceptuje 2 argumenty skladajucich sa iba z decimalnych cislic.
    Tu je vysledny kod (bez komentarov aby bolo nad cim rozmyslat:
    Kód:
    class subLongDec {
    	public static void main(String[] arguments){
    		boolean sign = false;
    		if(arguments.length != 2) {
                System.out.println("Wrong number of arguments");
                System.exit(1);
            }
    
            String cleannum1 = new String("");
            String cleannum2 = new String("");
            String temp = new String("");
    
            for(int j=0; j < arguments.length; j++){
                for(int i = 0; i < arguments[j].length(); i++){
                    if(arguments[j].charAt(i) < 48 || arguments[j].charAt(i) > 57) {
                        System.out.println("Incorrect number format, enter correct decimal integer.");
                        System.exit(1);
                    }
                }
            }
    
            temp = arguments[0];
            cleannum1 = temp;
            for(int i=0; i < temp.length(); i++){
                if(temp.charAt(i) == 48) cleannum1 = temp.substring(i+1);
                else break;
            }
    
            temp = arguments[1];
            cleannum2 = temp;
            for(int i=0; i < temp.length(); i++){
                if(temp.charAt(i) == 48) cleannum2 = temp.substring(i+1);
                else break;
            }
    
            System.out.println("n1: " + cleannum1 + " n2: " + cleannum2);
            
            int dif;
            if(cleannum1.length() > cleannum2.length()){
                dif = cleannum1.length() - cleannum2.length();
                for(int i = 0; i < dif; i++){
                    cleannum2 = "0" + cleannum2;
                }
            }
            else if(cleannum2.length() > cleannum1.length()){
                dif = cleannum2.length() - cleannum1.length();
                for(int i = 0; i < dif; i++){
                    cleannum1 = "0" + cleannum1;
                }
            }
    
            for(int i = 0; i < cleannum1.length(); i++){
                if(cleannum1.charAt(i) < cleannum2.charAt(i)){
                    sign = true;
                    break;
                }
                if(cleannum1.charAt(i) > cleannum2.charAt(i)) break;
            }
            if(sign == true){
                temp = cleannum1;
                cleannum1 = cleannum2;
                cleannum2 = temp;
            }
    
            int carr = 0;
            int c = 0;
            String sol = new String("");
            for(int i = cleannum1.length() - 1; i >= 0 ; i--){
                c = Integer.parseInt(cleannum1.substring(i,i+1)) - Integer.parseInt(cleannum2.substring(i,i+1)) - carr;
                if(c >= 0) {
                    sol = String.valueOf(c) + sol;
                    carr = 0;
                }
                else{
                    sol = String.valueOf(10 + c) + sol;
                    carr = 1;
                }
            }
    
            temp = sol;
            for(int i=0; i < temp.length() - 1; i++){
                if(temp.charAt(i) == 48) sol=temp.substring(i+1);
                else break;
            }
    
            if(sign == false) System.out.println("Sollution: " + sol);
            else System.out.println("Sollution: -" + sol);
            System.exit(0);		
    	}
    }
    Core 2 Quad Q8200 @ 3325MHz (1,28V) | Asus Maximus II Formula | Palit 9800GTX+ | 8GB A-Data 800+ EE | Noctua U12F | BenQ FP241W | Logitech MX518 | Logitech G11 | Logitech diNovo Edge

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •