# This is the hardest homework so far, by a substantial margin. Think of it as a practice Facebook or Google…

This is the hardest homework so far, by a substantial margin. Think of it as a practice Facebook or Google internship interview coding problem!

The most elegant solution among the first few submitted will get a special prize, and an invitation to work in our lab. TBA. *Focus on elegance & simplicity, for now, **rather than efficiency*.

First part is simpler, involving addition of arbitrary long numbers, & multiplication with single-digit multipliers.

The second part will simply adding a few lines (I expect 10-15) to the first part, to produce multiplication of arbitrary-long

numbers.

PART1: longpart1.c

`$ ./longpart1.out`

`Enter first number >9023905350290349`

`Enter second number >90283056923840923840239480239480234`

`1st num is 9023905350290349`

`2nd num is 90283056923840923840239480239480234`

`The sum is 90283056923840923849263385589770583`

`9023905350290349 times 2 is 18047810700580698`

`9023905350290349 times 3 is 27071716050871047`

`9023905350290349 times 4 is 36095621401161396`

`9023905350290349 times 5 is 45119526751451745`

`9023905350290349 times 6 is 54143432101742094`

`9023905350290349 times 7 is 63167337452032443`

`9023905350290349 times 8 is 72191242802322792`

`9023905350290349 times 9 is 81215148152613141`

The parts of this assignment are:

0) Checking if a long positive decimal number is valid (i.e., has no non-numerical, non-decimal digits)

1) Addition of two long positive numbers.

2) Multiplication of the first long positive number by numbers between 2 and 9

You’ll do this by implementing one non-recursive *main function,* to do each of the operations. This main function will set up initial conditions and call a *recursive helper *function to actually do the operation in a recursive manner.

All above have to be implemented using a recursive helper function for each of the above. ALL HELPER FUNCTIONS HAVE to be recursive. There should be one recursive helper function for the checking, one for the addition, and one for the single digit mutiplication. If it isn’t, we will consider it cheating, and award negative points that will be carried into your total score. See below.

You will store them as char * strings, and implement these subroutines that call the recursive helper functions:

int digcheck(char *theno) is “theno” a string that is a valid decimal number?

char *add2(char *n1, char *n2) add 2 numbers n1 and n2 and return the result

char *smult(char *n1, char d) multiply long number n1 by a single digit number d and return the result.

The add2 and smult are non-recursive functions will allocate memory for the result, on the heap, (to be discussed), and perhaps do some copying and then call helper functions which MUST BE recursive. **Hint:**** **These helper functions will require an extra argument, the carry digit. Think about it. They both return a pointer to the result, which is a string that they allocate on the heap. The helper recursive function will be essentially marching along from lower significant digits to upper significant digits. Think recursively: can you add single decimal digits stored in character form? OK. Now, then. If you have

successfully added the succeeding two streams of digits, and have a carry digit, how do produce the next digit, and move on?

The design of these helper functions is up to you, but they * MUST BE RECURSIVE.* Please ask for help if you don’t know how; don’t submit a non-recursive solution, because you WILL get negative points for that. We will spot check a number of homeworks by hand, if the solutions are not recursive, you WILL get -10 points for homework, which

**will be deducted from your over all homework score. If you don’t know how to do it recursively, ask us for help. Don’t submit a non-recursive solution.**Next week’s tutorials will be talking about this homework, and I will have extra office hours next week. We want you to succeed!

PART2* (longpart2.c) Multiplication of two long positive numbers; also implemented recursively. My implementation of the long multiplication is a seven-line recursive routine, that calls add2, and another little helper function. *The signature of the recursive routine is:

char *longmult(char *num1, char *num2, /*HINT: note the third argument*/ char *accum).

Again, it **must be recursive.** Non-recursive solutions WILL receive negative points. Don’t submit a non-recursive solution.

Example below including all parts (full details will be out tomorrow):

`$ ./longpart2.out`

`Enter first number >9023905350290349`

`Enter second number >90283056923840923840239480239480234`

`1st num is 9023905350290349`

`2nd num is 90283056923840923840239480239480234`

`The sum is 90283056923840923849263385589770583`

`9023905350290349 times 2 is 18047810700580698`

`9023905350290349 times 3 is 27071716050871047`

`9023905350290349 times 4 is 36095621401161396`

`9023905350290349 times 5 is 45119526751451745`

`9023905350290349 times 6 is 54143432101742094`

`9023905350290349 times 7 is 63167337452032443`

`9023905350290349 times 8 is 72191242802322792`

`9023905350290349 times 9 is 81215148152613141`

`The prod is 814705760415616250485659879410354657659904746461666`