Учитывая, что 50 - это очень немного (50-е простое число всего лишь 229), можно придумать всё что угодно (даже ужасающе неэффективное). Можно просто перебирать все числа, начиная с двойки, и каждое делить на все меньшие его, начиная с двойки. Если хоть на одно разделится - не простое, иначе простое. Попутно подсчитывая число простых чисел, N-е найти не составит труда.
Псевдокод: ввод N i = 2 counter = 0 нц для j = 2..(i - 1) если i mod j = 0 тогда увеличить i на 1 следующая итерация внешнего цикла увеличить counter на 1 если counter = N тогда вывод i завершение работы программы увеличить i на 1 кц
Дальше можно изменять эту программу, оптимизировать. Например, известно, что меньший собственный делитель любого составного числа не превосходит корня из этого числа, следовательно, можно во внутреннем цикле делать перебор не до i - 1, а до [sqrt(i)]. Другое полезное наблюдение может заключаться в том, что все простые числа кроме 2 имеют вид 6m - 1 или 6m + 1 (остальные не подходят: очевидно, 6n делится на 6, 6n +-2 четные числа, а 6n + 3 делится на 3). Это наблюдение позволит примерно в три раза сократить число итераций внешнего цикла. Наконец, можно сохранять все встретившиеся простые числа в массив, и затем проверять, делится ли текущее число на простые числа, меньшие себя: если не делится, то оно - тоже простое. Для хранения 50 маленьких натуральных чисел в памяти не нужно много места. Можно воспользоваться каким-нибудь другим алгоритмом, например, решетом Эратосфена. Но в зависимости от того, на каком языке программирования будет потом реализовываться этот алгоритм, он может записываться нетривиально. Для выполнения "на бумажке" решето Эратосфена - один из самых удобных В конце концов, можно использовать "читерский" метод - взять откуда-нибудь первые 50 простых чисел, записать их куда-нибудь, а потом просто за O(1) находить нужное число в памяти.
Паскаль --- uses crt; var a: array[1..100,1..100] of integer; x,y,sum,k,n:integer; begin write('Введите n: '); readln(n); clrscr; for x:=1 to n do begin for y:=1 to n do begin a[x,y]:=random(21)-10; write(a[x,y]:4); end; writeln; end; k:=0; Sum:=0; for x:=1 to n do for y:=x+1 to n do if a[x,y]>0 then begin Sum:=Sum+a[x,y]; inc(k); end; writeln; if k<>0 then write(sum/k:4:2); end.
Код для примитивной "рисовалки", рисуете что хотите. Для сохранения на рабочий стол нажимаете клавишу "Enter"
// PascalABC.NET // Версия 3.3.5 сборка 1662 (29.04.2018)
uses GraphABC;
begin Window.Title := 'Рисование мышью(Enter - сохранить на раб. стол)'; Pen.Color := Color.Red; Pen.Width := 3; OnMouseDown := (x,y,mb) -> MoveTo(x,y); OnMouseMove := (x,y,mb) -> if mb=1 then LineTo(x,y); var a:=System.Security.Principal.WindowsIdentity.GetCurrent.Name; OnKeyDown:=k->if k=13 then begin SaveWindow('C:\Users\'+copy(a,pos('\',a)+1,a.Length-pos('\',a)+1)+'\Desktop\image.png'); Window.Close; end; end.
Можно просто перебирать все числа, начиная с двойки, и каждое делить на все меньшие его, начиная с двойки. Если хоть на одно разделится - не простое, иначе простое. Попутно подсчитывая число простых чисел, N-е найти не составит труда.
Псевдокод:
ввод N
i = 2
counter = 0
нц
для j = 2..(i - 1)
если i mod j = 0 тогда
увеличить i на 1
следующая итерация внешнего цикла
увеличить counter на 1
если counter = N тогда
вывод i
завершение работы программы
увеличить i на 1
кц
Дальше можно изменять эту программу, оптимизировать. Например, известно, что меньший собственный делитель любого составного числа не превосходит корня из этого числа, следовательно, можно во внутреннем цикле делать перебор не до i - 1, а до [sqrt(i)].
Другое полезное наблюдение может заключаться в том, что все простые числа кроме 2 имеют вид 6m - 1 или 6m + 1 (остальные не подходят: очевидно, 6n делится на 6, 6n +-2 четные числа, а 6n + 3 делится на 3). Это наблюдение позволит примерно в три раза сократить число итераций внешнего цикла.
Наконец, можно сохранять все встретившиеся простые числа в массив, и затем проверять, делится ли текущее число на простые числа, меньшие себя: если не делится, то оно - тоже простое. Для хранения 50 маленьких натуральных чисел в памяти не нужно много места.
Можно воспользоваться каким-нибудь другим алгоритмом, например, решетом Эратосфена. Но в зависимости от того, на каком языке программирования будет потом реализовываться этот алгоритм, он может записываться нетривиально. Для выполнения "на бумажке" решето Эратосфена - один из самых удобных
В конце концов, можно использовать "читерский" метод - взять откуда-нибудь первые 50 простых чисел, записать их куда-нибудь, а потом просто за O(1) находить нужное число в памяти.