1. Нам треба пройти 15 чисел (1-й цикл), кожне з них в циклі перевіривши на простоту (2-й цикл). Тобто 2 цикли - необхідно і достатньо.
2. Ви перевіряєте, чи ділиться число j на число l. Для цього треба просто перевірити залишок: if( j % l == 0 )...
3. Програма вкрай неоптимальна. Для перевірки на подільність достатньо перевірити, чи не ділиться число на прості числа (раніше отримані!), не більші за корінь з цього числа. Чому тільки прості, сподіваюся, зрозуміло; чому саме за корінь? Тому що якщо число x розкладається в добуток y*z, то хоча б одне з чисел y та z має бути не більше за sqrt( x ), інакше маємо протиріччя: x = y * z > sqrt( x ) * sqrt( x ) = x, тобто x > x.
Для того, щоб не користатися зайвий раз бібліотекою cmath (за принципом YAGNI) можна виразити умову sqrt( x ) > y як x > y * y.
4. Давайте змінним зрозумілі імена.
5. Не використовуйте нестандартні функції (знову ж YAGNI), і не запитуйте вводу без пояснень.
Коротше:
#include <iostream>
using namespace std;
int main()
{
const int primesToFind = 15;
int primes[ primesToFind ],
primesFound = 0,
candidate = 2;
while( primesFound < primesToFind )
{
bool isPrime = true; // припускаємо, що наш кандидат - просте число
for( int i = 0;
( i < primesFound )
&& ( primes[ i ] * primes[ i ] <= candidate )
&& isPrime;
++i )
{
isPrime = ( candidate % primes[ i ] != 0 );
}
if( isPrime )
{
primes[ primesFound++ ] = candidate;
cout << candidate << endl;
}
++candidate;
}
cout << "Press enter to continue..." << endl;
cin.sync();
cin.get();
return 0;
}
Для подальшої оптимізації можна перевіряти тільки непарні числа чи тільки числа виду 6n±1.