#include <bits/stdc++.h>
using namespace std;
const int MAX_LN = 20;
const int D = 10;
const long long INF = 1LL << 60;
const double EPS = 1e-9;
const double PI = 3.14159265358979;
long long n;
long long dp[MAX_LN][1 << D][D][D];
long long pat[2][D];
void init(int S, int v0) {
  long long sdp[20];
  fill(sdp, sdp + 20, INF);
  sdp[10 + v0] = 0;
  sdp[10] = min(sdp[10], 1LL);
  for (int i = (0); i < (D); i++)
    if (S & (1 << i)) {
      for (int j = (10 - i); j < (20 - i); j++) {
        sdp[j] = min(sdp[j], sdp[j + i] + 1);
      }
    }
  for (int i = (0); i < (D); i++) dp[0][S][v0][i] = sdp[i];
}
void calc(int d, int S) {
  long long sdp[2][D];
  long long *curr = sdp[0], *next = sdp[1];
  for (int s = (0); s < (D); s++) {
    for (int i = (0); i < (2); i++)
      for (int j = (0); j < (D); j++) sdp[i][j] = INF;
    curr[s] = 0;
    if (d > 0) {
      {
        for (int j = (0); j < (D); j++) next[j] = INF;
        for (int j = (0); j < (D); j++)
          for (int k = (0); k < (D); k++) {
            next[k] = min(next[k], curr[j] + dp[d][S | (1 << 9)][j][k]);
          }
        swap(curr, next);
      }
      for (int i = 9; i >= 1; i--) {
        {
          for (int j = (0); j < (D); j++) next[j] = INF;
          for (int j = (0); j < (D); j++)
            for (int k = (0); k < (D); k++) {
              next[k] = min(next[k], curr[j] + dp[0][S | (1 << i)][j][k]);
            }
          swap(curr, next);
        }
        {
          for (int j = (0); j < (D); j++) next[j] = INF;
          for (int j = (0); j < (D); j++)
            for (int k = (0); k < (D); k++) {
              next[k] = min(next[k], curr[j] + dp[d][S | (1 << (i - 1))][j][k]);
            }
          swap(curr, next);
        }
      }
    } else {
      for (int i = 9; i >= 1; i--) {
        for (int j = (0); j < (D); j++) next[j] = INF;
        for (int j = (0); j < (D); j++)
          for (int k = (0); k < (D); k++) {
            next[k] = min(next[k], curr[j] + dp[0][S | (1 << i)][j][k]);
          }
        swap(curr, next);
      }
    }
    for (int i = (0); i < (D); i++) dp[d + 1][S][s][i] = curr[i];
  }
}
int main() {
  cin >> n;
  if (n == 0) {
    cout << 0 << endl;
    return 0;
  }
  int m = 0;
  long long t = n;
  while (t > 0) {
    t /= 10;
    m++;
  }
  for (int i = (0); i < (m - 1); i++)
    for (int j = (0); j < (D); j++)
      for (int k = (0); k < (D); k++)
        for (int l = (0); l < (D + 1); l++) dp[i][j][k][l] = INF;
  for (int i = (0); i < (1 << D); i++)
    for (int j = (0); j < (D); j++) {
      init(i, j);
    }
  for (int i = (0); i < (m - 2); i++) {
    for (int S = (0); S < (1 << D); S++) {
      calc(i, S);
    }
  }
  long long *curr = pat[0], *next = pat[1];
  for (int i = (0); i < (D); i++) {
    curr[i] = (n % 10 == i) ? 0 : INF;
  }
  for (int i = (0); i < (m - 1); i++) {
    n /= 10;
    int S = 0;
    int mod = n % 10;
    long long t = n / 10;
    while (t > 0) {
      S |= (1 << (t % 10));
      t /= 10;
    }
    if (i > 0) {
      for (int j = mod; j >= 1; j--) {
        {
          for (int k = (0); k < (D); k++) next[k] = INF;
          for (int k = (0); k < (D); k++)
            for (int l = (0); l < (D); l++) {
              next[l] = min(next[l], curr[k] + dp[0][S | (1 << j)][k][l]);
            }
          swap(curr, next);
        }
        {
          for (int k = (0); k < (D); k++) next[k] = INF;
          for (int k = (0); k < (D); k++)
            for (int l = (0); l < (D); l++) {
              next[l] = min(next[l], curr[k] + dp[i][S | (1 << (j - 1))][k][l]);
            }
          swap(curr, next);
        }
      }
    } else {
      for (int j = mod; j >= 1; j--) {
        for (int k = (0); k < (D); k++) next[k] = INF;
        for (int k = (0); k < (D); k++)
          for (int l = (0); l < (D); l++) {
            next[l] = min(next[l], curr[k] + dp[i][S | (1 << j)][k][l]);
          }
        swap(curr, next);
      }
    }
  }
  cout << *min_element(curr, curr + D) + 1 << endl;
  return 0;
}
