[ Tomcat131 @ 18.10.2008. 19:56 ] @
Kada dekadne zapise prirodnih brojeva počevši od broja 1 do nekog zadanog broja N redom napišemo jedan za drugim dobijamo niz cifara kojeg nazivamo brojniz tj.

12345678910111213141516171819202122 ... itd.

Napišite program koji će izračunati ukupan broj cifara u tom nizu.

na ulazu ide broj od 1 do 100 000 000
pretpostavljam da treba da se definise kao longint

e sad..poceo sam zadatak sa petljom for i:=1 to n do
begin
i zapucao..ne znam kako bih krenuo dalje....
mislite li da mozda pomocu while moze lakse i brze?neko ideju pls




ulaz 5 15 120
izlaz 5 21 252
[ Picsel @ 18.10.2008. 21:40 ] @
Evo primer za broj 120, broj cifara jednak je
1*9+2*90+3*21.
Mogao bi to jednostavno sa if
recimo,

Code:
if broj <10
  then brojcifara:=broj
  else if broj<100
          then brojcifara:=9+(broj-9)*2 
          else if broj<1000
                  then brojcifara:=9+180+(broj-99)*3   
                  else if broj<10000
                          then brojcifara:=9+180+2700+(broj-999)*4
                          itd.


Evo ako je broj manji od 10000 a veci od 999, znaci broj je cetvorocifren. Njegov brojniz ima zbir cifara svih jednocifrenih, dvocifrenih, trocifrenih i nekih cetvorocifrenih brojeva. Zbir cifara jednocifrenih brojeva je 9, dvocifrenih 180 (90*2), trocifrenih 2700 (900*3), a ostatak je zbir cetvorocifrenih brojeva do datog broja * 4 (jer svaki ima 4 cifre)
[ Tomcat131 @ 18.10.2008. 21:46 ] @
Svakako to sam i ja prokljuvio odma i napravio tabelicu..nego mene muci sto je na ulazu broj do 100 000 000...znaci treba da ide kilometarski program da bi ispisao mogucnosti sve do devetocifrenih brojeva???
[ Picsel @ 18.10.2008. 22:15 ] @
Kilometarski? Uopste ne, samo 8 If-ova (za svako povecanje cifre u broju po jedan). Ja sam vec pola ispisao
[ Tomcat131 @ 19.10.2008. 11:55 ] @
done:)


[Ovu poruku je menjao Tomcat131 dana 19.10.2008. u 13:08 GMT+1]

[Ovu poruku je menjao Tomcat131 dana 19.10.2008. u 13:38 GMT+1]
[ badam @ 19.10.2008. 23:48 ] @
Code:

brojcifara:=0;
for i:=1 to n do
  brojcifara:=brojcifara+length(IntToStr(i))


huh, nadam se da nisam 'proplivo' i da ovo nije samo iluzija rešenja koja mi se javila nakon mnoooogo pasulja i piva.

[Ovu poruku je menjao badam dana 20.10.2008. u 03:17 GMT+1]
[ Rapaic Rajko @ 24.10.2008. 20:46 ] @
badam, to jeste TACNO resenje, samo... koliko bi trajala ta petlja za 10^8 iteracija (vidi prvi post)? :)))

Rajko
[ Milan Milosevic @ 25.10.2008. 23:04 ] @
Nije lose samo sto stalno moras da prepravljas algoritam.
Evo jedno malo opstije resenje koje moze da se primeni za bilo koji ulazni podatak.


Function BrCifara(ABroj:String):Int64;
var
I:Integer;//
LenStr:Integer;//Duzina stringa
Broj:Integer; // Broj kao integer;
Step:Integer; // Stepen broja 10 n.p.r. 1 , 10 , 100 ,....
Begin
Result:=0; // Iniciramo rezultat na nulu
LenStr:=Length(ABroj); // Uzimamo duzunu stringa
Broj:=StrToInt(ABroj); // Prava vrednost broja
Step:=1;
for I := 1 to LenStr-1 do Step:=Step*10;
Broj:=Broj-Step;// Koliki je broj cifara veci od Step
Result:=(Broj+1)*LenStr;
Step:=Step div 10;
for I :=LenStr-1 downto 1 do begin
Result:=Result+9*Step*I;
Step:=Step div 10;
end;
End;