The nastiest method uses vfork() and lets the different children trample on different parts of memory before exiting; the parent then just adds up the modified bits of memory.
Highly unrecommended - but about the only case I've come across where vfork() might actually have a use.
Just for amusement (mine) I coded this up:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <sys/wait.h>
int main(void)
{
    int i;
    int array[5];
    int square[5];
    long sum = 0;
    srand(time(0));
    for (i = 0; i < 5; i++)
    {
        array[i] = rand();
        if (vfork() == 0)
        {
            square[i] = array[i] * array[i];
            execl("/bin/true", "/bin/true", (char *)0);
        }
        else
            wait(0);
    }
    for (i = 0; i < 5; i++)
    {
        printf("in: %d; square: %d\n", array[i], square[i]);
        sum += square[i];
    }
    printf("Sum: %d\n", sum);
    return(0);
}
This works.  The previous trial version using 'exit(0)' in place of 'execl()' did not work; the square array was all zeroes.  Example output (32-bit compilation on Solaris 10, SPARC):
in: 22209; square: 493239681
in: 27082; square: 733434724
in: 2558; square: 6543364
in: 17465; square: 305026225
in: 6610; square: 43692100
Sum: 1581936094
Sometimes, the sum overflows - there is much room for improvement in the handling of that.
The Solaris manual page for 'vfork()' says:
  Unlike with the fork() function, the child  process  borrows
   the  parent's  memory  and thread of control until a call to
   execve() or an exit (either  abnormally  or  by  a  call  to
   _exit()  (see  exit(2)).  Any  modification made during this
   time to any part of memory in the child process is reflected
   in  the  parent  process  on return from vfork(). The parent
   process is suspended while the child is using its resources.
That probably means the 'wait()' is unnecessary in my code.  (However, trying to simplify the code seemed to make it behave indeterminately.  It is rather crucial that i does not change prematurely; the wait() does ensure that synchronicity.  Using _exit() instead of execl() also seemed to break things.  Don't use vfork() if you value your sanity - or if you want any marks for your homework.)