Make a (somewhat) self-referential string
C, 64 bytes
l,i;main(n){for(scanf("%d%n",&n,&l);i<n;)printf("%0*d",l,i+=l);}
Takes a single integer as input on stdin.
JavaScript (ES6), 83 bytes
n=>[...Array(n/(l=`${n}`.length))].map((_,i)=>`${+`1e${l}`+l*++i}`.slice(1)).join``
Yes, that's a nested template string. 79 bytes in ES7:
n=>[...Array(n/(l=`${n}`.length))].map((_,i)=>`${10**l+l*++i}`.slice(1)).join``
Jelly, 12 bytes
VRUmLDUz0ZFU
I/O is in form of digit arrays. Try it online! or verify all test cases.
How it works
VRUmLDUz0ZFU Main link. Argument: A (digit array)
V Eval; turn the digits in A into an integer n.
R Range; yield [1, ..., n].
U Upend; reverse to yield [n, ..., 1].
L Yield the length (l) of A.
m Modular; keep every l-th integer in A.
D Decimal; convert each kept integer into the array of its digits.
U Upend; reverse the digits of each integer.
z0 Zip/transpose with fill value 0.
Z Zip again.
This right-pads all digit arrays with zeroes.
F Flatten the resulting 2D array.
U Upend/reverse it.