2015-07-31 5 views
1

Я пытаюсь написать функцию, которая находит количество простых чисел в массиве.Поиск числа простых чисел в массиве

int countPrimes(int a[], int size) 
{ 
    int numberPrime = 0; 
    int i = 0; 
    for (int j = 2; j < a[i]; j++) 
    { 
     if(a[i] % j == 0) 
      numbPrime++; 
    } 
    return numPrime; 
} 

Я думаю, что мне не хватает, я должен переопределить i после каждой итерации, но я не уверен, как это сделать.

+4

С одной стороны, 'numPrime',' numbPrime' и 'numPrime' - это не одна и та же переменная. –

+1

Ваша логика неверна - вы найдете все числа, которые делятся на какое-то число 0 ... a [i] - это не простые числа ... И да, вам нужен цикл for за пределами 'for (j = ...). –

ответ

5

Вам нужно 2 контура: 1 над массивом, 1 проверка всех возможных делителей. Я бы предложил разделить первичную проверку на функцию. Код:

bool primeCheck(int p) { 
    if (p<2) return false; 

    // Really slow way to check, but works 
    for(int d = 2; d<p; ++d) { 
     if (0==p%d) return false; // found a divisor 
    } 
    return true; // no divisors found 
} 

int countPrimes(const int *a, int size) { 
    int numberPrime = 0; 
    for (int i = 0; i < size; ++i) { 
     // For each element in the input array, check it, 
     // and increment the count if it is prime. 
     if(primeCheck(a[i])) 
      ++numberPrime; 
    } 
    return numberPrime; 
} 

Вы также можете использовать std::count_if так:

std::count_if(std::begin(input), std::end(input), primeCheck) 

Смотреть это жить here.

+0

... и если вы все равно пишете выделенную функцию, вы также можете использовать ['std :: count_if'] (http://en.cppreference.com/w/cpp/algorithm/count), чтобы упростить код. –

+0

@RobinKrahl Хорошее предложение, спасибо, я отредактирую его в свой ответ через минуту. Просто начал с того, что у него уже было. – BoBTFish

+0

Одна простая оптимизация: 'for (int d = 2; (d * d) <= p; ++ d) {/ * ... * /}'. Конечно, тогда есть вероятность, что переполнение 'd * d' должно быть рассмотрено ... –