Working with absurdly large numbers - StrNum++

A long time ago a bonus question for a math test was 'what is the number of trailing zeroes of the factorial of 2000?'. Ofcourse I did not know the answer, like most bonus questions. But when I sat behind my computer I figured I could make a BASIC program to solve the problem. Why not make a program that treats numbers as strings of characters, thus enabling it to work with very long numbers. So I started working on it and StrNum was born. It had a nice menu but it wasn't really useful for anything, other than demonstrating that it worked.

When I had to do a paper for mathematics this year I remembered the project and I thought I could improve the program and do the paper about it. I called the result StrNum++, or strnumpp.

Because I'm trying to do everything in Linux lately I had to find a way to convert the source to something that would compile on Linux. I never really learned another programming language than QuickBasic 4.5, laziness probably. Its main advantages are its dynamic string handling routines. I searched for versions of basic for Linux and found bwbasic and xbasic. Both required significant changes in my program. Then I remembered some experiments I did with a translator program to convert QB code to C code. It's called Qb2c and after some heavy modifications I could translate my program. After solving twenty-some gcc compiler errors I could start the program. Here's what it looked like (GUI had to be stripped, too much unsupported statements/bloat):

```2 + 1 = &w@Y%!@%^!
2 - 1 = 14Cgfe45!4
2 * 1 = qWE14!3%/"
2 / 1 = [\${|\(5%2x```

Ok, to be perfectly honest: I just typed some random keys in the above paragraph but the results did look very weird, don't remember them exactly. But after some time I finally found out that it had something to do with C variables not being initialized like QB variables. In QB a new variable is always 0 or "" (string). In C it can be literally anything. I really don't know who is responsible for this but I think it's some cruel plan to scare of potential new programmers. Some of the other QB statements that were not supported include:

EXIT DO/FOR
I temporarily substituted all EXIT DO/FOR statements with GOTO statements, forced to make up a new line number each time. After some time I figured a way to solve these problems in various elegant ways, but each case was different.
EXIT FUNCTION
This was really annoying because almost every FUNCTION used numerous EXIT FUNCTION statements. I solved this by making whole FUNCTIONS part of a conditional IF statements.
SWAP
This part was pretty easy. I only used this statement to swap strings so I just wrote a replacement called DreSwap to swap two strings.
string functions cannot be nested.
By using temporary variables and cutting longer lines in smaller parts I avoided nesting string functions.

QuickBasic source
C source (compile with "gcc strnumpp.c -o strnumpp[.exe] -s -O4")
Linux executable
DOS/Windows executable
FreeBSD executable
Solaris executable