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: 14722
  • 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: 14722
  • 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: 14722
  • 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: 14722
  • 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: 3714
  • 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: 14722
  • 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 469 korisnika na forumu :: 17 registrovanih, 1 sakriven i 451 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: aleksandarbl, Bobrock1, comi_pfc, Dejan84, dekan.m, Dostanic09, Georgius, kybonacci, laki_bb, loon123, mcalic, mihajlot2013, panzerwaffe, pirke96, Vatrogasaccc, vladulns, 1107