Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 18.01.2022
Сообщений: 42

Простые числа

12.04.2022, 22:58. Показов 493. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можете проверить, правильно ли я понял условие задачи и решил?

Условие : (двоичный поиск)
Определение простоты числа по таблице простых чисел. Если нужно определить, является ли не слишком большое натуральное число простым, можно воспользоваться таблицей простых чисел, включающей все простые числа от 2 до некоторого числа, больше или равного заданного. Если воспользоваться эффективным алгоритмом поиска, то время, затраченное на определение простоты числа, может оказаться меньше, чем непосредственная проверка, требующая, как правило, O(sqrt(n)) действий.
Написать программы и выполнить измерения в следующем порядке:
1) Заполнить таблицу простых чисел всеми простыми числами от 2 до 32767. Всего в этом диапазоне имеется 3512 простых чисел.
2) Измерить время, затраченное на последовательное определение простоты чисел от 2 до 32767 с использованием обычного алгоритма с временной сложностью не хуже O(sqrt(n)).
Алгоритм «Решето Эратосфена», позволяющий определить все простые до заданного n, не использовать, поскольку основная задача состоит в определении простоты отдельного числа.
3) Измерить время, затраченное на последовательное определение простоты чисел от 2 до 32767, используя поиск в таблице
Для определения времени работы программ можно использовать обычные часы с секундомером или, например, секундомер смартфона. Чтобы точность измерений была достаточной, необходимо измерять интервалы времени не короче 30 секунд. Если время работы программы оказывается меньше, можно поместить участок программы, время работы которого измеряется, в цикл, который выполняется столько раз, сколько требуется для того, чтобы время его многократного выполнения было не меньше 30 секунд.
Для измерения времени в PascalABC.NET можно воспользоваться функцией milliseconds.
Вывод результатов (простых чисел) при измерении времени должен быть отключен.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
program Veselo;
 
uses
   utils;
 
const
   x = 32767; 
 
var
   a: array [1..3512] of integer;
   i, j, k, r: Integer;
 
begin
   r := 1;
   for i := 2 to x do begin
      j := 1;
      k := 0;
      while j<=round(sqrt(i)) do begin
         if i mod j = 0 then begin
            k := k + 1;
            end; 
         j := j + 1;
      end;
      k := k - 1;
      if k = 0 then begin
         a[r] := i;
         //writeln(a[r]);
         r := r + 1;
      end;
   end;
   writeln(Milliseconds);
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.04.2022, 22:58
Ответы с готовыми решениями:

Вывести все простые числа, не превосходящее заданного числа (while/repeat)
Прошу помочь решить пару задач начального курса. 1. Написать программу, которая выводит все простые числа не превосходящее заданного...

Написать программу, которая выводит все простые числа, не превосходящие заданного числа
Написать программу, которая выводит все простые числа, не превосходящие заданного числа . ...

Удалить из последовательности простые числа и продублировать числа кратные 8
Ввести последовательность натуральных чисел. Если последовательность не упорядочена по невозрастанию и не упорядочена по неубыванию, ...

3
VR
 Аватар для vrvrvrvr1234
45 / 30 / 16
Регистрация: 18.07.2020
Сообщений: 114
14.04.2022, 18:47
Как-то странно вы написали программу... Нет бинарного поиска, обычный алгоритм написан некорректно.
Вот мой вариант:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function prost(a:integer):boolean;
begin
  for var i:=2 to round(sqrt(a)) do
    if a mod i = 0 then begin result:=False; exit end;
  result:=True;
end;
var s:=arr&<integer>();
begin
  for var i:=2 to 32767 do
    if prost(i) then s:=s+arr(i);
  millisecondsdelta();
  for var j:=1 to 6000 do //многократный запуск
  for var i:=2 to 32767 do
    prost(i);
  millisecondsdelta().Print; //время с использованием обычного алгоритма
  for var j:=1 to 6000 do
  for var i:=2 to 32767 do
    s.BinarySearch(i);
  millisecondsdelta().Print; //время с использованием таблицы
end.
Всё по заданию. Измерил, получил 82536 и 34220
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
15.04.2022, 20:10
vrvrvrvr1234
1. Вы замеряете скорость вывода (вызова .Print), а не только алгоритма. В данном случае, у меня это даёт разницу в пару процентов.
2. millisecondsdelta использует время системы (DateTime.Now) вместо встроенных в комп железок для измерения времени. В наше время для замеров используют StopWatch.
3. Компьютер всегда делает что то на фоне. И эта фоновая активность может увеличится/уменьшится во время теста одного из алгоритмов. Поэтому for var j:=1 to 6000 do должен быть внешним циклом - чтобы результаты замеров усреднялись.
4. Зачем вы объявили переменную s глобальной, да ещё и заполняли, копируя весь массив при добавлении одного элемента?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function IsPrime(a:integer):boolean;
begin
  Result := false;
  var i := 2;
  while i*i<a do
  begin
    if a.Divs(i) then exit;
    i += 1;
  end;
  Result := true;
end;
 
// Вместо магических чисел
const min_a = 2;
const max_a = 32767;
const test_rep_c = 600;
 
begin
  var all_primes := (min_a..max_a).Where(IsPrime).ToArray;
  // Чтобы JIT компилятор не мог удалить вызов (или его часть) IsPrime или BinarySearch
  var test_res := new boolean[max_a-min_a+1];
  
  var sw1 := new Stopwatch;
  var sw2 := new Stopwatch;
  
  // loop вместо for, потому что переменная цикла не здалась
  loop test_rep_c do
  begin
    
    sw1.Start;
    for var a := min_a to max_a do
      test_res[a-min_a] := IsPrime(a);
    sw1.Stop;
    
    sw2.Start;
    for var a := min_a to max_a do
      test_res[a-min_a] := all_primes.BinarySearch(a)<>-1;
    sw2.Stop;
    
  end;
  
  Println(sw1.Elapsed);
  Println(sw2.Elapsed);
  
  // Для чистоты теста надо вырубить генерацию отладочной информации в настройках компилятора
  // И запускать с помощью Shift+F9
  // Readln тут чтобы программа не завершалась сразу
  Readln;
end.
1
VR
 Аватар для vrvrvrvr1234
45 / 30 / 16
Регистрация: 18.07.2020
Сообщений: 114
16.04.2022, 11:19
Спасибо, понял)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.04.2022, 11:19
Помогаю со студенческими работами здесь

Вывести взаимно простые числа
begin 1.To(ReadInteger('n=')).Print end. Имеется код по нахождению натуральных чисел меньше числа n. Нужно добавить...

Найти все простые числа от 2 до 1000
Найти все простые числа от 2 до 1000. Простое число-число, которое делится только на 1 и на само себя, т.е. количество делителей для такого...

Найти все меньшие n простые числа
Дано натуральное число n. Найти все меньшие n простые числа.

Получить все простые делители числа
Дано натуральное число N. Получить все простые делители этого числа. Решите с помощью for

Найти все простые числа-близнецы
Помогите! НЕ понимаю вообще как реализовать.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru