Visual Long Multiplication
python, 303
def f(s):
a,b=s.split('*')
a,b=map(lambda l:reduce(lambda x,y:x+[1]*int(y)+[0],l,[0]),[reversed(a),b])
n=sum(map(len,[a,b]))
l=[[' ']*n for i in xrange(n)]
for i,x in enumerate(a):
for j,y in enumerate(b):
l[i+j][j-i+len(a)]=r' \/x'[x+2*y]
return '\n'.join(''.join(x[2:-1]) for x in l[1:-2])
I think it's enough human-readable.
Verification:
print '---'
print '\n'.join('"%s"'%x for x in f('21001*209').split('\n'))
print '---'
---
" \ / "
" x / "
" / x "
" / / \ "
" \ / / \ / "
" x / x / "
" \ / x / x / "
"\ x / \ / / x / "
" x x \ / / / x / "
"/ x \ x / / / x / "
" / \ \ / x / / / x / "
" \ x / x / / / x / "
" x x / x / / / x /"
" / x x / x / / / x "
" / x x / x / / / \"
" / x x / x / / "
" / x x / x / "
" / x x / x "
" / x x / \ "
" / x x "
" / x \ "
" / \ "
---
Python 3, 205 bytes
L=a,b=[eval("+[0]+[1]*".join("0%s0"%x)[2:])for x in input().split()]
A,B=map(len,L)
for c in range(2,A+B-1):print((" "*abs(c-A)+" ".join(" \/X"[a[i-c]+2*b[i]]for i in range(max(0,c-A),min(c,B))))[1:A+B-2])
The expressions are quite long so I think there's a fair amount of room for improvement, but anyway...
Takes input space-separated via STDIN, e.g.
21 32
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
There's a possible trailing space on some lines, but the A+B-2
ensures that all of the trailing spaces are within the bounding box.