[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í :D
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 ;)
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.
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);
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.
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.
Re: [JAVA] Odčítání nekonečného čísel
Citace:
Původně odeslal
Chuck
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 :D.
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.
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);
}
}