Broj cifara celog broja

1

Broj cifara celog broja

offline
  • Niko E
  • Software & Information Engineering
  • Pridružio: 05 Maj 2009
  • Poruke: 135
  • Gde živiš: Wien

Imam zadatak da napišem program koji treba da prebroji cifre celog broja. (Npr za 1111 = 4, -25 = 2 ...)
Ja sam napisao program, ali nisam siguran:
    private static int brojc(int num) {    int count = 0;    if (num < 0)             num *= (-1);     if (num < 10 && num >= 0) {             count = 1;          } else {          while (num > 0) {    num /= 10;    count++;    }    }    System.out.println(count);    return count;    }



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14571
  • Gde živiš: Niš

Napisano: 19 Okt 2014 12:09

U šta nisi siguran? U ispravnost? Jesi li ga pokrenuo da proveriš?

Dopuna: 19 Okt 2014 12:11

Inače, drugi if blok je suvišan. A i bez prvog se može ako se modifikuje uslov while petlje.



offline
  • Niko E
  • Software & Information Engineering
  • Pridružio: 05 Maj 2009
  • Poruke: 135
  • Gde živiš: Wien

Pokrenuo sam, radi. Nisam siguran za return. I da li u jednoj metodi može biti 2 ili više return?

Taj drugi if blok mi je potreban unese nula.

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14571
  • Gde živiš: Niš

Napisano: 19 Okt 2014 12:16

Nikola04 ::I da li u jednoj metodi može biti 2 ili više return?Može.

Dopuna: 19 Okt 2014 12:21

A čekaj, šta će ti u jednoj fuknciji i štampanje vrednosti i vraćanje vrednosti? Obično se funkcije koje štampaju vrednosti deklarišu bez povratne vrednosti (void), a one koje vraćaju neku vrednost ne štampaju ništa. Odaberi jedan od ta dva načina, nema potrebe za ovim hibridima. Very Happy

offline
  • Niko E
  • Software & Information Engineering
  • Pridružio: 05 Maj 2009
  • Poruke: 135
  • Gde živiš: Wien

Ma ja bih to uradio ovako:
Long.valueOf(int);
Nego moram da radim sa while (tako stoji u zadatku), što se Jave tiče, apsolutni sam početnik.

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14571
  • Gde živiš: Niš

Nisam siguran šta bi postigao naredbom iznad.

Takođe, algoritam je potpuno isti ma koji jezik da je u pitanju. Very Happy

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Mozda neispravno sa tacke studiranja, ali ja bih prvo odradio jedan ABS (apsolutna vrednost), pa onda pretvodio broj u string (nesto tipa X.toString), i onda izmerio duzinu stringa (svaki programski jezik ima nesto tipa LEN ili LENGTH naredbe)

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14571
  • Gde živiš: Niš

To jeste moguće rešenje, ali maši suštinu koja se ogleda u tome kako "izračunati" broj cifara nekog broja. Very Happy Ovo je čist školski primer.

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3645
  • Gde živiš: 127.0.0.1

I ja bih, kao i bobby, radio sa apsolutnom vrednoscu unetog broja, jer -25 i 25 imaju isti broj cifara, ali je u kodu jedan uslov manje.

Drugi deo bi malcice drugacije uradio, ali to vec iz mene govori matematicar, a ne programer Wink

private static int brojc(int num) {     int abs = Math.abs(num) + 1;     return abs === 0 ? 1 : Math.ceil(Math.log10(abs + 1)); }

Zasto ovako - zato sto je logaritam nekog broja eksponent kojim treba stepenovati osnovu da bi se dobio taj broj. Log10 se od "obicnog" logaritma razlikuje po tome sto mu je osnova 10.

E sad - kakve to veze ima sa zadatkom? Log10 od broja 10 je 1, od broja 100 je 2, od 123 je 2.0899051114393976. Od 0 tezi minus beskonacnosti, pa to izdvajamo u poseban slucaj (zato onaj short if u return liniji).

Druga varijanta je da broj nije nula, tj veci od nje (tacnije njegova apsolutna vrednost). Tu imamo dve operacije: ceil (zaokruzuje broj na prvi sledeci ceo broj), i dodavanje broja jedan na broj koji "merimo". Zasto dodajemo 1? Zato sto je log10(10) jedan, a treba da vrati 2, a to ce se desiti tek sa brojem 11, nakon zaokruzivanja (istom logikom 100 i 101, 1000 i 1001 itd). Zasto zaokruzujemo na sledeci ceo broj? Zato sto npr. log10 od 123 (utvrdjujemo duzinu broja 122) iznosi 2.0899051114393976 a program treba da vrati 3 kao broj cifara. "Normalno" zaokruzivanje bi taj broj zaokruzilo na 2, sto je netacno, a nije ni moguce jednostavno dodati 1 jer bi onda za broj 9 vracao 2 kao broj cifara (jer prethodno dodajemo 1 broju 9, dobijamo 10, njegov log10 je 1 i plus 1 je 2).

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14571
  • Gde živiš: Niš

Napisano: 21 Okt 2014 2:03

I šta kada unesemo 999, ili bilo koji ovakav granični slučaj? + 1 je u prvoj liniji višak. Very Happy

Dopuna: 21 Okt 2014 2:06

Inače, zanimljiv pristup. Very Happy Znaš li možda kako se tačno izračunava logaritam? Interesuje me čisto zbog složenosti. Very Happy

Ko je trenutno na forumu
 

Ukupno su 659 korisnika na forumu :: 30 registrovanih, 3 sakrivenih i 626 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., AleksSE, amaterSRB, Atomski čoban, cenejac111, dane007, darkangel, Drug pukovnik, Duh sa sekirom, hooraay, HrcAk47, manda87, MarKhan, milekNS, milijarder, nuke92, Oluj2.1, pacika, Pavle01, pein, Penzula, powSrb, Recce, repac, TetkaPersa, vlvl, voja64, zajcev1, zdrebac, zoranis