Portál AbcLinuxu, 30. listopadu 2025 10:09
strlen(num)' zase o tolik delší nepřipadá…
Logaritmus je první, co člověka napadne, ale to naráží na zaokrouhlovací chyby.
Tu druhou myšlenku bych realizoval spíš tak, že bych šel nejdřív po 10^(2^k) a pak bych půlil interval. Ale když vezmu v úvahu, jaký je maximální počet desítkových číslic pro používané celočíselné typy, vychází mi, že nestojí za to vymýšlet nic přehnaně sofistikovaného.
Ale když vezmu v úvahu, jaký je maximální počet desítkových číslic pro používané celočíselné typy, vychází mi, že nestojí za to vymýšlet nic přehnaně sofistikovaného.
Třeba v Pythonu je omezen velikostí paměti. Na těchto dvou gigabajtech by to mohlo být už krapet zajímavé.
Logické řešení spočívá v cyklickém celočíselném dělení dotyčného čísla desítkou a zaznamenávání počtu iterací.Ne, logické řešení spočívá ve výpočtu logaritmu a vhodném použití jeho celočíselné části, třeba takhle, i když je to hnusné (jen rychlý nástřel):
1+(long)(log(0.5+atol(cislo))/M_LN10). Kdyby na vstupu byl řetězec s číslicemi, tak prosím, ale o tom nebyla řeč.
atol() tam nemá co dělat, předpokládám, že už na vstupu je číslo.
)
void main (int argc, char *argv[]) {
printf("%d\n", argc > 1 ? strlen(argv[1]) : 0);
}
$ perl -e '$_ = 1111; print y///c;' 4
def pocet_znaku(n):
r = 1
while n > 9:
c = 1
q = 10
while q * q < n:
q = q * q
c *= 2
r += c
n /= q
return r
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.