#include <bits/stdc++.h>
using namespace std;
struct edge {
  long long to, cost;
};
inline long long madd(long long a, long long b) {
  a %= 1000000007;
  b %= 1000000007;
  return (a + b) % 1000000007;
}
inline long long msub(long long a, long long b) {
  a %= 1000000007;
  b %= 1000000007;
  a += 1000000007;
  return (a - b) % 1000000007;
}
inline long long mmul(long long a, long long b) {
  a %= 1000000007;
  b %= 1000000007;
  return (a * b) % 1000000007;
}
inline long long mpow(long long a, long long r) {
  long long res = 1;
  while (r > 0) {
    if (r & 1) res = res * a % 1000000007;
    a = a * a % 1000000007;
    r >>= 1;
  }
  return res;
}
inline long long minv(long long a) {
  a %= 1000000007;
  long long b = 1000000007, u = 0, v = 1;
  while (a) {
    long long t = b / a;
    b -= t * a;
    swap(a, b);
    u -= t * v;
    swap(u, v);
  }
  if (u < 0) u += 1000000007;
  return u;
}
inline long long mdiv(long long a, long long b) {
  a %= 1000000007;
  a *= minv(b);
  return a % 1000000007;
}
struct UnionFind {
  vector<int> data;
  UnionFind(int size) : data(size, -1) {}
  bool unite(int x, int y) {
    x = root(x);
    y = root(y);
    if (x != y) {
      if (data[y] < data[x]) swap(x, y);
      data[x] += data[y];
      data[y] = x;
    }
    return x != y;
  }
  bool same(int x, int y) { return root(x) == root(y); }
  int root(int x) { return data[x] < 0 ? x : data[x] = root(data[x]); }
  int size(int x) { return -data[root(x)]; }
};
double s(long long l) {
  double d = l;
  long long su = 0;
  while (l > 0) {
    su += l % 10;
    l /= 10;
  }
  return d / su;
}
int main(void) {
  long long now = 999999999999999;
  double nowval = s(now);
  long long tosubs[] = {1,
                        10,
                        100,
                        1000,
                        10000,
                        100000,
                        1000000,
                        10000000,
                        100000000,
                        1000000000,
                        10000000000,
                        100000000000,
                        1000000000000,
                        10000000000000,
                        100000000000000};
  vector<long long> result;
  result.push_back(now);
  while (now > 9) {
    for (long long tosub : tosubs) {
      if (tosub > now) continue;
      if (s(now - tosub) < nowval) {
        now = now - tosub;
        break;
      }
    }
    result.push_back(now);
    nowval = s(now);
  }
  reverse(result.begin(), result.end());
  for (long long l : result) {
    cout << l << endl;
  }
  return 0;
}
