using System.Diagnostics;
public static void Main()
var digits = int.MaxValue / 32 - 4;
void test(string name, Func<int, int> f) {
var sw = new Stopwatch();
Console.WriteLine($"{name.PadRight(15)} result: {res} ticks: {sw.ElapsedTicks}");
test(nameof(CountPagesSlow), CountPagesSlow);
test(nameof(CountPages), CountPages);
test(nameof(CountPagesOpt), CountPagesOpt);
public static int CountPagesSlow(int digits) {
digits -= pages.ToString().Length;
public static int CountPages(int digits) {
while (digits > nextRange * digitsPerPage) {
digits -= nextRange * digitsPerPage;
currentRange = nextRange;
nextRange = nextRange * 10;
public static int CountPagesOpt(int digits) {
while (digits > nextRange * digitsPerPage) {
digits -= nextRange * digitsPerPage;
currentRange = nextRange;
nextRange = nextRange * 10;
while (digits >= digitsPerPage * mul) {
digits -= digitsPerPage * mul;
if (digits > 0 && digits < digitsPerPage) {
throw new Exception("Incorrect digit count");