int numberLength(int n) {
  if (n <= 19) {
    switch (n) {
    case 0:
      return 0;
    case 1:
    case 2:
    case 6:
    case 10:
      return 3;
    case 4:
    case 5:
    case 9:
      return 4;
    case 3:
    case 7:
    case 8:
      return 5;
    case 12:
    case 11:
      return 6;
    case 15:
    case 16:
      return 7;
    case 13:
    case 14:
    case 18:
    case 19:
      return 8;
    case 17:
      return 9;
    }
  } else if (n <= 99) {
    switch (n) {
    case 20 ... 29:
      return 6 + numberLength(n - 20);
    case 30 ... 39:
      return 6 + numberLength(n - 30);
    case 40 ... 49:
      return 5 + numberLength(n - 40);
    case 50 ... 59:
      return 5 + numberLength(n - 50);
    case 60 ... 69:
      return 5 + numberLength(n - 60);
    case 70 ... 79:
      return 7 + numberLength(n - 70);
    case 80 ... 89:
      return 6 + numberLength(n - 80);
    case 90 ... 99:
      return 6 + numberLength(n - 90);
    }
  } else if (n <= 999) {
    int length = numberLength(n / 100) + 7;
    if (n % 100 != 0) {
      length += 3 + numberLength(n % 100);
    }
    return length;
  }
  return 11;
}


x86 assembly (clang, -O0):
<numberLength>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x8(%rbp)
cmpl   $0x13,-0x8(%rbp)
jg     11af <numberLength+0x9f>
mov    -0x8(%rbp),%eax
mov    %rax,-0x18(%rbp)
sub    $0x13,%rax
ja     11aa <numberLength+0x9a>
mov    -0x18(%rbp),%rax
lea    0xfff(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x0,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
movl   $0x3,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
movl   $0x4,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
movl   $0x5,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
movl   $0x6,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
movl   $0x7,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
movl   $0x8,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
movl   $0x9,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
jmp    1300 <numberLength+0x1f0>
cmpl   $0x63,-0x8(%rbp)
jg     1297 <numberLength+0x187>
mov    -0x8(%rbp),%eax
add    $0xffffffec,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x4f,%eax
ja     1292 <numberLength+0x182>
mov    -0x20(%rbp),%rax
lea    0xe27(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%edi
sub    $0x14,%edi
call   1030 <numberLength@plt>
add    $0x6,%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
mov    -0x8(%rbp),%edi
sub    $0x1e,%edi
call   1030 <numberLength@plt>
add    $0x6,%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
mov    -0x8(%rbp),%edi
sub    $0x28,%edi
call   1030 <numberLength@plt>
add    $0x5,%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
mov    -0x8(%rbp),%edi
sub    $0x32,%edi
call   1030 <numberLength@plt>
add    $0x5,%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
mov    -0x8(%rbp),%edi
sub    $0x3c,%edi
call   1030 <numberLength@plt>
add    $0x5,%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
mov    -0x8(%rbp),%edi
sub    $0x46,%edi
call   1030 <numberLength@plt>
add    $0x7,%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
mov    -0x8(%rbp),%edi
sub    $0x50,%edi
call   1030 <numberLength@plt>
add    $0x6,%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
mov    -0x8(%rbp),%edi
sub    $0x5a,%edi
call   1030 <numberLength@plt>
add    $0x6,%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
jmp    12fb <numberLength+0x1eb>
cmpl   $0x3e7,-0x8(%rbp)
jg     12f6 <numberLength+0x1e6>
mov    -0x8(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,%edi
call   1030 <numberLength@plt>
add    $0x7,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     12eb <numberLength+0x1db>
mov    -0x8(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %edx,%edi
call   1030 <numberLength@plt>
add    $0x3,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1307 <numberLength+0x1f7>
jmp    12fb <numberLength+0x1eb>
jmp    1300 <numberLength+0x1f0>
movl   $0xb,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<numberLength>:
push   %rbp
push   %r14
push   %rbx
xor    %eax,%eax
cmp    $0x13,%edi
jg     1142 <numberLength+0x32>
mov    %edi,%ebx
cmp    $0x13,%ebx
ja     1223 <numberLength+0x113>
mov    %ebx,%ecx
lea    0x1011(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0x3,%ebx
jmp    1228 <numberLength+0x118>
cmp    $0x63,%edi
ja     1172 <numberLength+0x62>
lea    -0x14(%rdi),%ebx
cmp    $0x4f,%ebx
ja     1221 <numberLength+0x111>
lea    0xea6(%rip),%rax
movslq (%rax,%rbx,4),%rcx
add    %rax,%rcx
jmp    *%rcx
mov    $0x6,%eax
cmp    $0x13,%ebx
jbe    1126 <numberLength+0x16>
jmp    1223 <numberLength+0x113>
xor    %eax,%eax
cmp    $0x3e7,%edi
ja     1223 <numberLength+0x113>
movzwl %di,%r14d
mov    %r14d,%eax
shr    $0x2,%eax
imul   $0x147b,%eax,%ebp
shr    $0x11,%ebp
mov    %ebp,%edi
call   1030 <numberLength@plt>
mov    %eax,%ebx
imul   $0x64,%ebp,%eax
sub    %ax,%r14w
je     11d8 <numberLength+0xc8>
movzwl %r14w,%edi
call   1030 <numberLength@plt>
add    %ebx,%eax
add    $0xa,%eax
jmp    122a <numberLength+0x11a>
mov    $0x8,%ebx
jmp    1228 <numberLength+0x118>
mov    $0x5,%ebx
jmp    1228 <numberLength+0x118>
mov    $0x4,%ebx
jmp    1228 <numberLength+0x118>
mov    $0x6,%ebx
jmp    1228 <numberLength+0x118>
mov    $0x7,%ebx
jmp    1228 <numberLength+0x118>
add    $0x7,%ebx
xor    %eax,%eax
jmp    1228 <numberLength+0x118>
add    $0xffffffe2,%edi
jmp    1210 <numberLength+0x100>
add    $0xffffffd8,%edi
jmp    11f1 <numberLength+0xe1>
add    $0xffffffce,%edi
jmp    11f1 <numberLength+0xe1>
add    $0xffffffc4,%edi
call   1030 <numberLength@plt>
add    $0x5,%eax
jmp    122a <numberLength+0x11a>
add    $0xffffffba,%edi
call   1030 <numberLength@plt>
add    $0x7,%eax
jmp    122a <numberLength+0x11a>
add    $0xffffffb0,%edi
jmp    1210 <numberLength+0x100>
add    $0xffffffa6,%edi
call   1030 <numberLength@plt>
add    $0x6,%eax
jmp    122a <numberLength+0x11a>
mov    $0x9,%ebx
jmp    1228 <numberLength+0x118>
xor    %eax,%eax
mov    $0xb,%ebx
add    %ebx,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define i32 @numberLength(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %3
%5 = load i32, i32* %3
%6 = icmp sle i32 %5, 19
br i1 %6, label %7, label %18
7: ; preds = %1
%8 = load i32, i32* %3
switch i32 %8, label %17 [
i32 0, label %9
i32 1, label %10
i32 2, label %10
i32 6, label %10
i32 10, label %10
i32 4, label %11
i32 5, label %11
i32 9, label %11
i32 3, label %12
i32 7, label %12
i32 8, label %12
i32 12, label %13
i32 11, label %13
i32 15, label %14
i32 16, label %14
i32 13, label %15
i32 14, label %15
i32 18, label %15
i32 19, label %15
i32 17, label %16
]
9: ; preds = %7
store i32 0, i32* %2
br label %87
10: ; preds = %7, %7, %7, %7
store i32 3, i32* %2
br label %87
11: ; preds = %7, %7, %7
store i32 4, i32* %2
br label %87
12: ; preds = %7, %7, %7
store i32 5, i32* %2
br label %87
13: ; preds = %7, %7
store i32 6, i32* %2
br label %87
14: ; preds = %7, %7
store i32 7, i32* %2
br label %87
15: ; preds = %7, %7, %7, %7
store i32 8, i32* %2
br label %87
16: ; preds = %7
store i32 9, i32* %2
br label %87
17: ; preds = %7
br label %86
18: ; preds = %1
%19 = load i32, i32* %3
%20 = icmp sle i32 %19, 99
br i1 %20, label %21, label %64
21: ; preds = %18
%22 = load i32, i32* %3
switch i32 %22, label %63 [
i32 20, label %23
i32 21, label %23
i32 22, label %23
i32 23, label %23
i32 24, label %23
i32 25, label %23
i32 26, label %23
i32 27, label %23
i32 28, label %23
i32 29, label %23
i32 30, label %28
i32 31, label %28
i32 32, label %28
i32 33, label %28
i32 34, label %28
i32 35, label %28
i32 36, label %28
i32 37, label %28
i32 38, label %28
i32 39, label %28
i32 40, label %33
i32 41, label %33
i32 42, label %33
i32 43, label %33
i32 44, label %33
i32 45, label %33
i32 46, label %33
i32 47, label %33
i32 48, label %33
i32 49, label %33
i32 50, label %38
i32 51, label %38
i32 52, label %38
i32 53, label %38
i32 54, label %38
i32 55, label %38
i32 56, label %38
i32 57, label %38
i32 58, label %38
i32 59, label %38
i32 60, label %43
i32 61, label %43
i32 62, label %43
i32 63, label %43
i32 64, label %43
i32 65, label %43
i32 66, label %43
i32 67, label %43
i32 68, label %43
i32 69, label %43
i32 70, label %48
i32 71, label %48
i32 72, label %48
i32 73, label %48
i32 74, label %48
i32 75, label %48
i32 76, label %48
i32 77, label %48
i32 78, label %48
i32 79, label %48
i32 80, label %53
i32 81, label %53
i32 82, label %53
i32 83, label %53
i32 84, label %53
i32 85, label %53
i32 86, label %53
i32 87, label %53
i32 88, label %53
i32 89, label %53
i32 90, label %58
i32 91, label %58
i32 92, label %58
i32 93, label %58
i32 94, label %58
i32 95, label %58
i32 96, label %58
i32 97, label %58
i32 98, label %58
i32 99, label %58
]
23: ; preds = %21, %21, %21, %21, %21, %21, %21, %21, %21, %21
%24 = load i32, i32* %3
%25 = sub nsw i32 %24, 20
%26 = call i32 @numberLength(i32 %25)
%27 = add nsw i32 6, %26
store i32 %27, i32* %2
br label %87
28: ; preds = %21, %21, %21, %21, %21, %21, %21, %21, %21, %21
%29 = load i32, i32* %3
%30 = sub nsw i32 %29, 30
%31 = call i32 @numberLength(i32 %30)
%32 = add nsw i32 6, %31
store i32 %32, i32* %2
br label %87
33: ; preds = %21, %21, %21, %21, %21, %21, %21, %21, %21, %21
%34 = load i32, i32* %3
%35 = sub nsw i32 %34, 40
%36 = call i32 @numberLength(i32 %35)
%37 = add nsw i32 5, %36
store i32 %37, i32* %2
br label %87
38: ; preds = %21, %21, %21, %21, %21, %21, %21, %21, %21, %21
%39 = load i32, i32* %3
%40 = sub nsw i32 %39, 50
%41 = call i32 @numberLength(i32 %40)
%42 = add nsw i32 5, %41
store i32 %42, i32* %2
br label %87
43: ; preds = %21, %21, %21, %21, %21, %21, %21, %21, %21, %21
%44 = load i32, i32* %3
%45 = sub nsw i32 %44, 60
%46 = call i32 @numberLength(i32 %45)
%47 = add nsw i32 5, %46
store i32 %47, i32* %2
br label %87
48: ; preds = %21, %21, %21, %21, %21, %21, %21, %21, %21, %21
%49 = load i32, i32* %3
%50 = sub nsw i32 %49, 70
%51 = call i32 @numberLength(i32 %50)
%52 = add nsw i32 7, %51
store i32 %52, i32* %2
br label %87
53: ; preds = %21, %21, %21, %21, %21, %21, %21, %21, %21, %21
%54 = load i32, i32* %3
%55 = sub nsw i32 %54, 80
%56 = call i32 @numberLength(i32 %55)
%57 = add nsw i32 6, %56
store i32 %57, i32* %2
br label %87
58: ; preds = %21, %21, %21, %21, %21, %21, %21, %21, %21, %21
%59 = load i32, i32* %3
%60 = sub nsw i32 %59, 90
%61 = call i32 @numberLength(i32 %60)
%62 = add nsw i32 6, %61
store i32 %62, i32* %2
br label %87
63: ; preds = %21
br label %85
64: ; preds = %18
%65 = load i32, i32* %3
%66 = icmp sle i32 %65, 999
br i1 %66, label %67, label %84
67: ; preds = %64
%68 = load i32, i32* %3
%69 = sdiv i32 %68, 100
%70 = call i32 @numberLength(i32 %69)
%71 = add nsw i32 %70, 7
store i32 %71, i32* %4
%72 = load i32, i32* %3
%73 = srem i32 %72, 100
%74 = icmp ne i32 %73, 0
br i1 %74, label %75, label %82
75: ; preds = %67
%76 = load i32, i32* %3
%77 = srem i32 %76, 100
%78 = call i32 @numberLength(i32 %77)
%79 = add nsw i32 3, %78
%80 = load i32, i32* %4
%81 = add nsw i32 %80, %79
store i32 %81, i32* %4
br label %82
82: ; preds = %75, %67
%83 = load i32, i32* %4
store i32 %83, i32* %2
br label %87
84: ; preds = %64
br label %85
85: ; preds = %84, %63
br label %86
86: ; preds = %85, %17
store i32 11, i32* %2
br label %87
87: ; preds = %86, %82, %58, %53, %48, %43, %38, %33, %28, %23, %16, %15, %14, %13, %12, %11, %10, %9
%88 = load i32, i32* %2
ret i32 %88
}

LLVM IR (-O2):
define i32 @numberLength(i32 %0) {
%2 = icmp slt i32 %0, 20
br i1 %2, label %3, label %13
3: ; preds = %16, %1
%4 = phi i32 [ 0, %1 ], [ 6, %16 ]
%5 = phi i32 [ %0, %1 ], [ %17, %16 ]
switch i32 %5, label %63 [
i32 0, label %65
i32 1, label %6
i32 2, label %6
i32 6, label %6
i32 10, label %6
i32 4, label %7
i32 5, label %7
i32 9, label %7
i32 3, label %8
i32 7, label %8
i32 8, label %8
i32 12, label %9
i32 11, label %9
i32 15, label %10
i32 16, label %10
i32 13, label %11
i32 14, label %11
i32 18, label %11
i32 19, label %11
i32 17, label %12
]
6: ; preds = %3, %3, %3, %3
br label %65
7: ; preds = %3, %3, %3
br label %65
8: ; preds = %3, %3, %3
br label %65
9: ; preds = %3, %3
br label %65
10: ; preds = %3, %3
br label %65
11: ; preds = %3, %3, %3, %3
br label %65
12: ; preds = %3
br label %65
13: ; preds = %1
%14 = icmp ult i32 %0, 100
br i1 %14, label %15, label %48
15: ; preds = %13
switch i32 %0, label %63 [
i32 20, label %16
i32 21, label %16
i32 22, label %16
i32 23, label %16
i32 24, label %16
i32 25, label %16
i32 26, label %16
i32 27, label %16
i32 28, label %16
i32 29, label %16
i32 30, label %20
i32 31, label %20
i32 32, label %20
i32 33, label %20
i32 34, label %20
i32 35, label %20
i32 36, label %20
i32 37, label %20
i32 38, label %20
i32 39, label %20
i32 40, label %24
i32 41, label %24
i32 42, label %24
i32 43, label %24
i32 44, label %24
i32 45, label %24
i32 46, label %24
i32 47, label %24
i32 48, label %24
i32 49, label %24
i32 50, label %28
i32 51, label %28
i32 52, label %28
i32 53, label %28
i32 54, label %28
i32 55, label %28
i32 56, label %28
i32 57, label %28
i32 58, label %28
i32 59, label %28
i32 60, label %32
i32 61, label %32
i32 62, label %32
i32 63, label %32
i32 64, label %32
i32 65, label %32
i32 66, label %32
i32 67, label %32
i32 68, label %32
i32 69, label %32
i32 70, label %36
i32 71, label %36
i32 72, label %36
i32 73, label %36
i32 74, label %36
i32 75, label %36
i32 76, label %36
i32 77, label %36
i32 78, label %36
i32 79, label %36
i32 80, label %40
i32 81, label %40
i32 82, label %40
i32 83, label %40
i32 84, label %40
i32 85, label %40
i32 86, label %40
i32 87, label %40
i32 88, label %40
i32 89, label %40
i32 90, label %44
i32 91, label %44
i32 92, label %44
i32 93, label %44
i32 94, label %44
i32 95, label %44
i32 96, label %44
i32 97, label %44
i32 98, label %44
i32 99, label %44
]
16: ; preds = %15, %15, %15, %15, %15, %15, %15, %15, %15, %15
%17 = add nsw i32 %0, -20
br label %3
18: ; preds = %65, %58, %44, %40, %36, %32, %28, %24, %20
%19 = phi i32 [ %23, %20 ], [ %27, %24 ], [ %31, %28 ], [ %35, %32 ], [ %39, %36 ], [ %43, %40 ], [ %47, %44 ], [ %62, %58 ], [ %68, %65 ]
ret i32 %19
20: ; preds = %15, %15, %15, %15, %15, %15, %15, %15, %15, %15
%21 = add nsw i32 %0, -30
%22 = tail call i32 @numberLength(i32 %21)
%23 = add i32 %22, 6
br label %18
24: ; preds = %15, %15, %15, %15, %15, %15, %15, %15, %15, %15
%25 = add nsw i32 %0, -40
%26 = tail call i32 @numberLength(i32 %25)
%27 = add i32 %26, 5
br label %18
28: ; preds = %15, %15, %15, %15, %15, %15, %15, %15, %15, %15
%29 = add nsw i32 %0, -50
%30 = tail call i32 @numberLength(i32 %29)
%31 = add i32 %30, 5
br label %18
32: ; preds = %15, %15, %15, %15, %15, %15, %15, %15, %15, %15
%33 = add nsw i32 %0, -60
%34 = tail call i32 @numberLength(i32 %33)
%35 = add i32 %34, 5
br label %18
36: ; preds = %15, %15, %15, %15, %15, %15, %15, %15, %15, %15
%37 = add nsw i32 %0, -70
%38 = tail call i32 @numberLength(i32 %37)
%39 = add i32 %38, 7
br label %18
40: ; preds = %15, %15, %15, %15, %15, %15, %15, %15, %15, %15
%41 = add nsw i32 %0, -80
%42 = tail call i32 @numberLength(i32 %41)
%43 = add i32 %42, 6
br label %18
44: ; preds = %15, %15, %15, %15, %15, %15, %15, %15, %15, %15
%45 = add nsw i32 %0, -90
%46 = tail call i32 @numberLength(i32 %45)
%47 = add i32 %46, 6
br label %18
48: ; preds = %13
%49 = icmp ult i32 %0, 1000
br i1 %49, label %50, label %63
50: ; preds = %48
%51 = trunc i32 %0 to i16
%52 = udiv i16 %51, 100
%53 = zext i16 %52 to i32
%54 = tail call i32 @numberLength(i32 %53)
%55 = add nsw i32 %54, 7
%56 = urem i16 %51, 100
%57 = icmp eq i16 %56, 0
br i1 %57, label %65, label %58
58: ; preds = %50
%59 = zext i16 %56 to i32
%60 = tail call i32 @numberLength(i32 %59)
%61 = add i32 %54, 10
%62 = add i32 %61, %60
br label %18
63: ; preds = %15, %48, %3
%64 = phi i32 [ 0, %48 ], [ %4, %3 ], [ 0, %15 ]
br label %65
65: ; preds = %50, %3, %63, %12, %11, %10, %9, %8, %7, %6
%66 = phi i32 [ %64, %63 ], [ %4, %12 ], [ %4, %11 ], [ %4, %10 ], [ %4, %9 ], [ %4, %8 ], [ %4, %7 ], [ %4, %6 ], [ %4, %3 ], [ 0, %50 ]
%67 = phi i32 [ 11, %63 ], [ 9, %12 ], [ 8, %11 ], [ 7, %10 ], [ 6, %9 ], [ 5, %8 ], [ 4, %7 ], [ 3, %6 ], [ %5, %3 ], [ %55, %50 ]
%68 = add nsw i32 %67, %66
br label %18
}