Я бы написал программу следующим образом
#include <iostream>
#include <iterator>
#include <algorithm>
bool is_prime( unsigned int n )
{
bool prime = n % 2 == 0 ? n == 2 : n != 1;
for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
{
prime = n % i != 0;
}
return prime;
}
int main()
{
unsigned int a[] = { 3, 5, 7, 8, 9, 11, 13, 17, 19, 20, 23, 29, 31, 37, 41 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t maxseq = 0;
for ( auto current = std::find_if( a, a + N, is_prime );
current != a + N;
current = std::find_if( current, a + N, is_prime ) )
{
auto first = current;
current = std::find_if_not( current, a + N, is_prime );
size_t n = std::distance( first, current );
if ( maxseq < n ) maxseq = n;
}
std::cout << "The longest sequence is: " << maxseq << '\n';
return 0;
}
Вывод программы:
The longest sequence is: 5
Я не использовал универсальные функции std::begin( a )
и std::end( a )
, потому что в вашей программемассив может содержать меньше фактических элементов, чем размерность массива.
Если вы еще не знаете, стандартные алгоритмы C ++, тогда программу можно определить следующим образом:
#include <iostream>
bool is_prime( unsigned int n )
{
bool prime = n % 2 == 0 ? n == 2 : n != 1;
for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
{
prime = n % i != 0;
}
return prime;
}
int main()
{
unsigned int a[] = { 3, 5, 7, 8, 9, 11, 13, 17, 19, 20, 23, 29, 31, 37, 41 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t maxseq = 0;
size_t n = 0;
for ( size_t i = 0; i < N; i++ )
{
bool prime = a[i] % 2 == 0 ? a[i] == 2 : a[i] != 1;
for ( unsigned int j = 3; prime && j <= a[i] / j; j += 2 )
{
prime = a[i] % j != 0;
}
if ( prime )
{
if ( maxseq < ++n ) maxseq = n;
}
else
{
n = 0;
}
}
std::cout << "The longest sequence is: " << maxseq << '\n';
return 0;
}
Выход программы
The longest sequence is: 5
Что касается вашей программы, то этот цикл
for (int i = 1; i < x - 1; i = j) {
пропускает первый элемент массива bar[0]
.
И благодаря этому утверждению
j = i + 1;
расчетное значение seq
на единицу меньше, чем должно быть, поскольку вы не учитываете, что bar[i]
уже является простым.
Первоначально установите seq равным 1.
int seq = 1;
Более того, вы неправильно определяете простые числа. Например, согласно вашему алгоритму 1 простое.