Вторник, 17.06.2025, 20:21 Приветствую Вас Гость

Решение задач любой сложности

Главная | Регистрация | Вход | RSS

Все статьи на сайте

Главная » Статьи » Решение заданий Delphi

Задача: Найти N-ный элемент последовательности Хемминга
Стыдно сказать, но о том, что последовательность простых чисел, расположенных по возрастанию, называется последовательностью Хемминга, я узнала буквально вчера, когда искала какую-нибудь интересную типовую задачу для сайта.
О простых числах, которые считаются простыми, потому что делятся только на себя и на единицу, мне естественно известно со школы, но вот бедный Хемминг и его последовательность... А может, просто забылась эта смешная фамилия за давностью лет...
Так или иначе, создался повод поговорить о решении заданий на последовательность Хемминга. К примеру, требуется написать программу на Delphi, которая из введенных пользователем 4 чисел (вид [2 3 5 N]), извлекает N и находит N-ный элемент последовательности.
Что касается алгоритма, задача у нас состоит из двух частей - для начала требуется выделить нужный нам признак N, а уж затем искать его в последовательности, которую предварительно нужно как-то сформировать.
На мой взгляд, наибольно сложная часть алгоритма состоит в том, чтобы именно сформировать последовательность Хемминга. И сформировывать ее я решила в динамическом массиве, потому что заранее размерность массива в принципе не известна и ограничена этим самым N.
К сожалению, заполнение массива мне представляется ни чем иным как перебором всех чисел, расположенных до искомого. Поэтому используем цикл while do. Нужные нам числа из последовательности будем определять по булевому флагу AddBool, который будет принимать значение False, в случае, если текущая выборка делится еще на какое-либо простое число из нашего массива, помимо себя и единицы.
В общем, все описанные задачи выглядят следующими Delphi исходниками:

procedure TForm1.Button1Click(Sender: TObject);
var
   s:string;
   i, number:integer;
   nEl:integer;
   arrHemm: array of integer;
   AddBool:boolean;
   nAdd: integer;
begin
   s:=Edit1.text;

   number:=Pos(' ',s);
   Delete(s,1,number);
   number:=Pos(' ',s);
   Delete(s,1,number);
   number:=Pos(' ',s);
   Delete(s,1,number);

   nEl:=StrToInt(s);

   if nEl<>0 then
    begin
     SetLength(ArrHemm,nEL);

     number:=2;
     ArrHemm[0]:=1;
     ArrHemm[1]:=2;
     nAdd:=2;
     AddBool:=true;
     while ArrHemm[nEL-1]=0 do
      begin
       number:=number+1;
       for i := 1 to nEl-2 do
        if ArrHemm[i]<>0 then
         if Number mod ArrHemm[i]=0 then
             AddBool:=false;
        if addBool=true then
           begin
            ArrHemm[nAdd]:=number;
            nAdd:=nAdd+1
           end;
        AddBool:=true;
      end;
     edit1.Text:=intTostr(ArrHemm[nEL-1])
end;

end;

Как вы видите, первые 2 числа последовательности Хемминга я задала самостоятельно для удобства. Переменная nAdd по сути является адресом для вставки в массив нового простого числа, и она равна 2, поскольку это индекс следующего числа, после заданных мной. Увеличиваем его вручную, потому как не каждый цикл будет соответствовать его увеличению.
Все неизвестные ячейки массива принимаются равными нулю, поэтому необходимо это учитывать.
Задача решена:)
Возможно ваше задание несколько отличается от представленного и вызывает у вас какие-либо трудности - напишите мне - я выполню решение на заказ.
Категория: Решение заданий Delphi | Добавил: Мятка (22.10.2010) | Автор: Alexandra W
Просмотров: 2952 | Теги: программы на заказ, примеры Delphi, написать программу, Delphi исходники, алгоритм, решение на заказ, решение заданий, программирование на delphi | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: