/* Return the sum of the digits in the prime factorization of a composite number N.
   If N is a prime, the return value is 0 and isPrime is set to 1 */
long int getDigitSumFactorization(long int N, long int *isPrime)
{
    long int index = 0, sumFactor = 0, copyN = N;
    *isPrime = 0;

    if(N <= 1)
        return 0;

    for(index = 0; index < primeArrSize && primeArr[index] * primeArr[index] <= N; index++)
    {
        while(copyN % primeArr[index] == 0)
        {
            sumFactor += getDigitSum(primeArr[index]);
            copyN /= primeArr[index];
        }
    }

    if(copyN == N)
        /* N is a prime! */
        *isPrime = 1;
    else
        if(copyN > 1)
            sumFactor += getDigitSum(copyN);

    return sumFactor;
}
bool check(int threshold, int rows, int cols, int row, int col, bool* visited)
{
    if(row >=0 && row < rows && col >= 0 && col < cols
        && getDigitSum(row) + getDigitSum(col) <= threshold
        && !visited[row* cols + col])
        return true;
    
    return false;
}
/* Return 1 if N is a Smith number. Return 0 otherwise */
int isSmithNumber(long int N)
{
    long int isPrime, digitSum, digitSumFactor;

    digitSumFactor = getDigitSumFactorization(N, &isPrime);
    if(isPrime)
        return 0;       /* A Smith number must be composite */

    digitSum = getDigitSum(N);
    return digitSum == digitSumFactor;
}