Optimization of sieve of Erathosthenes
if (z[i] == 0)
    for (j = 2 * i; j &lt; 100000; j = j + i)
        z[j] = 1;


can be changed to 

if (z[i] == 0)
    for (j = i * i; j &lt; 100000; j = j + 2 * i)
        z[j] = 1;


as


k * i (with k &lt; i) is already set to 1 by sieve k.
when j is odd, j + i is even and so already set by even sieve.


For readability, you may split into function and do some renaming, to have something like:

const int N = 100000;
const int SQRT_N = 316;

void shieve(char (&amp;isNotPrime)[N])
{
    memset(isNotPrime, 0, N);
    isNotPrime[0] = 1; // 0 is not a prime
    isNotPrime[1] = 1; // 1 is not a prime
    // now remove all evens from 4 up
    for (int i = 4; i &lt; N; i = i + 2) {
        isNotPrime[i] = 1; // remove evens
    }
    // now loop through remaing up to square root of max number
    for (int i = 3; i &lt; SQRT_N; i = i + 2) {
        if (!isNotPrime[i]) {
            for(int j = i * i; j &lt; N; j = j + 2 * i) {
                isNotPrime[j] = 1;
            }
        }
    }
}