Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2013, 20:56   #1
NikitosNP
Новичок
Джуниор
 
Регистрация: 08.04.2013
Сообщений: 1
По умолчанию Задача по Pascal

Добрый вечер)Помогите пожалуйста)
В интервале от а до b найти все парные простые числа. Парными простыми числами называют два простых числа, разность между которыми равна 2. Например, 3 и 5, 11 и 13, 17 и 19.

Желательно с комментариями к задаче
Спасибо)
NikitosNP вне форума Ответить с цитированием
Старый 08.04.2013, 22:40   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Так-с.. Такие числа называются простыми числами близнецами (если я не ошибаюсь), так что гуглите. Недавно решал её (код в школе ) и помнится я делал тупым перебором (только четные числа отбрасывал..) и скорость была удовлетворительная..
Набросок моего решения :
Код:
i := a + Ord(Odd(a));
b := b - Ord(Not(Odd(b)));

while i+2 <= b do begin
       if IsPrime(i) and (IsPrime(i+2)) then
            WriteLn (i, ' ', i+2);
       Inc (i, 2)
end;
Не проверял

Т.к. код, представленный выше работает, но при маленьких значениях A и огроменных значения B, такой перебор может быть слишком долог, могу предложить чуть-чуть оптимизированный вариант.

Вариант#1
Просто берем и загоняем в массив простые числа из промежутка [A, B] (для скорости возьмем решето Эратосфена или решето Аткина)
Теперь бежим по массиву и если a[i+1] - a[i] = 2, то выводим

Вариант#2
Этот вариант является просто маленькой оптимизацией вариант#0
Код:
f1 := IsPrime(i);
while ... begin
    f2 := Is Prime(i+2);
    if f1 and f2 then
       WriteLn (..);
    f1 := f2
end;

Последний раз редактировалось Stilet; 09.04.2013 в 08:10.
Poma][a вне форума Ответить с цитированием
Старый 09.04.2013, 08:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
IsPrime(i)
Рома, а может тогда стоит еще и ссылку на эту функцию кинуть, раз уж воспользовался ею?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.04.2013, 08:15   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на форуме по данному слову легко найди данную функцию.
но, раз такой вопрос возник, почему бы сюда и выложить код, будет 900000 + 1 тема с данным кодом!

Код:
{вычисление простых чисел в диапазоне a..b}

function isPrime(X: LongInt): boolean;
var i: integer;
Begin
     isPrime:=false;
     if x<2 then Exit;
     if not odd(x) and (x<>2) { проверяем на чётность  }
          then exit;
     i:=3;
     while i <= sqrt(x) do { проверяем только нечётные }
     begin
          if x mod i = 0 then Exit;
          inc(i,2);
     end;
     isPrime:=true;
End;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.04.2013, 13:29   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
на форуме по данному слову легко найди данную функцию.
но, раз такой вопрос возник, почему бы сюда и выложить код, будет 900000 + 1 тема с данным кодом!
В данном конкретном случае это неправильная функция.
Правильная должна примерно выглядеть так:
Код:
function IsPrime(n : longint) : boolean;
begin
  result := PrArray[n div 2];
end;
Где PrArray - заранее подготовленный при помощи "решета Эратосфена" массив.
s-andriano вне форума Ответить с цитированием
Старый 09.04.2013, 13:42   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от s-andriano
В данном конкретном случае это неправильная функция.
Правильная должна примерно выглядеть так:
Да ладно, "неправильная" - это правильная функция проверки числа на простоту!

BTW, а Вы только мой пост прочитали? Или удосужились выше сообщение посмотреть, где Poma][a использовал данную функцию?


p.s. и откуда взялось n div 2 ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.04.2013, 15:29   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Моя функция, проигрывающая варианту Сержа
Код:
function IsPrime (n : Integer): Boolean;
var
   i, sq : Integer;
   
begin
     IsPrime := FALSE;
     sq := Trunc (Sqrt(n)); // решил не заморачиваться 
     
     for i := 2 to sq do
         if n mod i = 0 then
            Exit;
            
     IsPrime := TRUE
            
end;
Цитата:
p.s. и откуда взялось n div 2 ?!
Мы ведь отбрасываем четные варианты, а их - половина.


Мой полный код (написан он тупо (= без какой-либо оптимизации)) :
Код:
const
     SIZE = 1000;
     
function IsPrime (n : Integer): Boolean;
var
   i, sq : Integer;
   
begin
     IsPrime := FALSE;
     sq := Trunc (Sqrt(n));
     
     for i := 2 to sq do
         if n mod i = 0 then
            Exit;
            
     IsPrime := TRUE
            
end;
     
var
   i : Integer;
   
begin
     i := 3;
     
     while i <= SIZE do begin
           if IsPrime(i) and IsPrime(i+2) then
              WriteLn (i, ' ', i+2);
           Inc (i, 2)
     end
     
end.
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на Pascal ivan7771 Паскаль, Turbo Pascal, PascalABC.NET 9 10.03.2013 17:26
Задача turbo pascal на тему: файлы с произвольным доступом в Pascal ExCiTeC Паскаль, Turbo Pascal, PascalABC.NET 0 28.01.2013 20:36
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
Задача Pascal Cruzel Помощь студентам 3 05.11.2011 20:18
Задача на Pascal C1er1c Помощь студентам 6 29.12.2008 15:42