На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Проверка числа на простоту , выод делителей
    Приветствую всех, на днях решил занятся изучением делфи, но т.к. я не программист то возникто сразу много вопросов.
    вот например такая задача: в поле едит запрашивается положит число. определить явл оно простым или нет и если число не простое вывести его делители.

    вот что получилось у меня:
    procedure delitel;
    var
    i,n,k:integer;
    begin
    k:=0;
    n:=StrToInt(Form1.Edit1.Text);
    for i:=1 to n do
    if n mod i =0 then
    begin
    inc(k);
    form1.Label2.Caption:=IntToStr(i)+' ';
    end;
    if k=2 then
    Form1.Label1.Caption:=IntToStr(n)+ ' - простое число'
    else
    Form1.Label1.Caption:=IntToStr(n)+ ' - не простое число';
    end;


    наведите на путь истинный, как вывести делители числа? буду очень благодарен.
      можно попробывать в цикле от 1 до ТвоеЧисло -1 попробывать твое число делить на переменную цикла и если результат деления будет целочисленным, то вот ты и получил уже два делителя
        Есть два классических способа решения - поищи в гугле: решето Эратосфена (для простых случаев), тест Рабина-Миллера (для очень больших чисел)
          а вообще так сходу не скажу... мож какие математические методы есть:)

          Добавлено
          Ins лучше решение сказал:)
            насколько я понимаю после этого условия
            for i:=1 to n do
            if n mod i =0 then
            в n хранится делитель, или нет?
              Цитата serdemon @
              for i:=1 to n do
              if n mod i =0 then
              в n хранится делитель, или нет?


              Ну и зачем тебе делить до n, если можно делить до sqrt(n) + 1? И зачем тебе делить на 4, если можно ограничится только проверкой делимости на 2? Почитай про решето Эратосфена, лениво два слова в гугле набрать? ;)
                делитель хранится в i. а n - это число для которого ты делители ищеш
                  Метод рабочий, но не самый быстрый.
                  ExpandedWrap disabled
                    function IsSimple(const Val: Cardinal): Boolean;
                    var
                      I: Cardinal;
                    begin
                      I := 2;
                      Result := True;
                      while I <= round(Sqrt(Val)) do
                      begin
                        if (Val mod I) = 0 then
                          Result := False;
                        Inc(I);
                      end;
                    end;
                  Сообщение отредактировано: Domino -
                    Ins прав. я приблизительный вариант предложил
                      извините, за мои глупые вопросы...
                      про решето Эратосфена я прочитал, но не особо понял, т.к. там еще и с массивом.
                      ребят вы меня похоже немного не поняли, я хочу используя свой код (он у меня работает) вывести все делители числа (через пробел или запятую, без разницы).
                      можно даже так в поле эдит я ввожу число, мне нужно вывести все его делители
                      Сообщение отредактировано: serdemon -
                        ExpandedWrap disabled
                          k:=0;
                          n:=StrToInt(Edit1.Text);
                          Label2.Caption := '';
                          for i:=1 to n do
                          if n mod i =0 then
                          begin
                          inc(k);
                          Label2.Caption:=Label2.Caption + IntToStr(i)+' ';
                          end;
                          if k=2 then
                          Label1.Caption:=IntToStr(n)+ ' - простое число'
                          else
                          Label1.Caption:=IntToStr(n)+ ' - не простое число';
                          and85 спасибо, только было бы лучше, если б ты просто подсказал как сделать
                            А при чем тут простые числа тогда, если тебе делители нужны?
                            Перебираешь от 1 до k (тупо без оптимизации), проверяешь, делится или нет. Если делится, добавляешь в строку. Вот и весь алгоритм.
                              мне нужно было сделать так, определить какое число, если простое то вывести сообщение "число н простое", а если оно не простое то вывести сообщение "число н не простое" и еще одно сообщение где указаны все его делители

                              P.S. спасибо всем за помощь.
                                Если не умеешь работать с массивами, то вот алгоритм
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0349 ]   [ 16 queries used ]   [ Generated: 24.06.25, 23:23 GMT ]