Portál AbcLinuxu, 21. května 2025 13: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.