Как найти простое число delphi

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
function Prime(a: Cardinal): boolean;
var
  i1, i2, i3, i4, i5, i6, i7, i8, bound: Cardinal;
begin
   if a<2 then
      result:=false
   else if a in [2,3,5,7,11,13,17,19,23,29] then
      result:=true
   else if(a mod 2 =0)or(a mod 3 =0)or(a mod 5 =0)or(a mod 7 =0)or(a mod 11=0)or
          (a mod 13=0)or(a mod 17=0)or(a mod 19=0)or(a mod 23=0)or(a mod 29=0)then
      result:=false
   else
   begin
     bound:=trunc(sqrt(a));
     i1:=31;
     i2:=37;
     i3:=41;
     i4:=43;
     i5:=47;
     i6:=49;
     i7:=53;
     i8:=59;
     while(i8<=bound)and(a mod i1<>0)and(a mod i2<>0)and(a mod i3<>0)and(a mod i4<>0)and
                        (a mod i5<>0)and(a mod i6<>0)and(a mod i7<>0)and(a mod i8<>0)do
     begin
       inc(i1,30);
       inc(i2,30);
       inc(i3,30);
       inc(i4,30);
       inc(i5,30);
       inc(i6,30);
       inc(i7,30);
       inc(i8,30);
     end;
     result:=(i8>bound)and
             ((i1>bound)or(i2>bound)or(i3>bound)or(i4>bound)or(i5>bound)or(i6>bound)or(i7>bound)or
             ((a mod i1)or(a mod i2)or(a mod i3)or(a mod i4)or(a mod i5)or(a mod i6)or(a mod i7)<>0));
  end;
end;

I want to read all prime numbers between 1 and 10000 into a dynamic array and all non-prime numbers into another dynamic array and then read the prime array into richedit1 so far I have:

procedure primearrays;
var
  j, k, l, i, m: integer; // k is the number I am testing for prime number
  // j is used in the for loop to check all numbers smaller than k to see if k is dividable by j
  // l is just a variable set to k mod j to make the if run more smoothly
  // i is the length of the array anotprime
  // m is used to set the length of the array aprime
  bflag: boolean; // bflag is to show if this number is a prime number
  aprime, anotprime: array of integer;
  // aprime is the array of prime and anotprime is the array of nonprime numbers
begin
  j := 0;
  i := 0;
  l := 0;
  richedit1.Lines.Clear;
  bflag := false;
  for k := 2 to 10000 do
  begin
    j := 0;
    while not(j = (k - 1)) do
    begin
      inc(j);
      l := k mod j;
      if (l = 0) then
      begin
        bflag := false;
        inc(i);
        setlength(anotprime, i);
        anotprime[i - 1] := k;
        j := k - 1;
      end
      else
      begin
        bflag := true;
      end;
    end;
    m := -1;
    if (bflag) then
    begin
      inc(m);
      setlength(aprime, m);
      aprime[m - 1] := k;
      richedit1.Lines.Add(inttostr(aprime[l-1]));
    end;
  end;
end;

but this doesn’t seem to work. It puts all the integers into anotprime.

LU RD's user avatar

LU RD

34.4k5 gold badges88 silver badges294 bronze badges

asked Nov 12, 2014 at 8:13

theunie's user avatar

10

Perhaps the main problem you have is that you mix all the different aspects (looping over candidates, prime checking, display etc.) into a single function.

Life becomes much easier if you decompose the task into small pieces that just perform a single task. Start with a function to test if a number is prime.

function IsPrime(N: Integer): Boolean;
var
  M: Integer;
begin
  Assert(N > 0);
  if N = 1 then // annoying special case
  begin
    Result := False;
    exit;
  end;
  for M := 2 to (N div 2) do
  begin
    if N mod M = 0 then
    begin
      Result := False;
      exit;
    end;
  end;
  Result := True;
end;

Now you might wish to make a list containing primes:

var 
  Primes: TList<Integer>;
  N: Integer;
....
// create Primes
for N := 1 to 10000 do
  if IsPrime(N) then
    Primes.Add(N);

This is not the most efficient way to enumerate primes. But it’s probably where you should start and I’ve mainly written this answer to encourage you to separate code into small logical methods that do specific focused tasks.

RepeatUntil's user avatar

RepeatUntil

2,2724 gold badges32 silver badges57 bronze badges

answered Nov 12, 2014 at 10:17

David Heffernan's user avatar

David HeffernanDavid Heffernan

599k42 gold badges1061 silver badges1479 bronze badges

8

procedure TForm1.btnprimeClick(Sender: TObject);
var K, I, iCount : Integer;
begin
  for K := iStart to iEnd do
  begin
    iCount := 0;
    for I := 2 to iEnd do
    begin
      if K mod I = 0 then
      begin
        Inc(iCount);
      end;
    end;
    if iCount = 1 then
    begin
      memData.Lines.Add(IntToStr(K));
    end;
  end;
end;

TERMINATOR's user avatar

TERMINATOR

1,1501 gold badge10 silver badges24 bronze badges

answered May 31, 2017 at 15:14

ILoveAMac's user avatar

 

Автор : ZED.

Для начала определимся, какое число является простым.
Простое число — это натуральное число, которое имеет только два делителя: 1 и само число. Например числа — 1 и 2 — являются простыми, так как делятся без остатка только на 1 и на само себя, и больше делителей не имеют. Ну тут все понятно.
Теперь, когда мы определились с математикой, приступим непосредственно к написанию довольно простенькой програмки, которая и будет определять(вычислять) — является ли число простым или нет.
Писать мы будем на Delphi.

Следует только догадываться, что нужно сделать сначала…Совершенно верно: мы запускаем делфу и скорее всего новый проект уже открыт.

Теперь установим свойства формы. Размер пока не трогаем. Лучше изменим свойство BorderStyle в bsSingle (т.е. размер формы изменятся не будет). Затем изменим свойство BorderIcons таким образом:

biSystemMenu — true
biMinimize — true
biMaximize — false
biHelp — false

т.е. мы фактически изменили одно свойство biMaximize, чтобы наше окно(окно программы) нельзя было разворачивать(максимизировать).

Теперь изменим свойство Caption. Например напишем : Прога определяет простое число или нет. Хотя можно написать что-то вроде : Моя прога. Вообщем, что вашей душе угодно. Это не так уж и важно.

Ну а теперь расставим компоненты. Тут тоже можно сделать как кому нравится.
Я предлагаю следующие : TEdit — для ввода числа, TMemo — для вывода результата(хотя можно и TEdit например…а может быть и нужно, но суть не меняется. Можете вообще рисовать на форме текст[TextOut]), и TButton — для выполнения расчета. Так же поместим два компонента TLabel. В свойстве первого Caption пишем : Введите число, а второго : Результат. Очищаем Text у TEdit, и Lines у TMemo. А в свойстве Caption компонента TButton пишем : Проверить.

Ну а когда расставили все компоненты можно изменить размер формы.

В общем наша форма теперь выглядит примерно так:

окно формы в проекте. определение простого числа

Ну а теперь напишем процедуру для определения сложного числа(или простого, если оно таковым является).

итак наша процедурка будет выглядеть так (все закомментировано):

procedure TForm1.NFigure;
var figure,i:integer;//введенное число и переменная цикла
f:boolean;//логическая переменная
begin
//переводим введенную строку(число в TEdit) в целочисленный тип
// и присваиваем значение переменной figure

figure:=StrToInt(Edit1.Text);

//если число 1 или 2, то не вычисляем, а сразу выводим результат — число ПРОСТОЕ
if ((figure=1) or (figure=2)) then
begin
memo1.Text:=’Число ‘+Edit1.Text+’ ПРОСТОЕ!’;//Это собственно вывод результата
end else
//в противном случае(если число отлично от 1 или 2)
begin
//то
//присваиваем логической переменной f значение false (типа, число пока простое)

f:=false;
//теперь начинаем искать делители, начиная с 2 и до числа меньшего нашего на единицу
//т.е. простое число итак делится на 1 и на само себя без остатка(и только-больше делителей //быть не должно)

for i:=2 to figure-1 do
begin
//если число делится без остатка(хотя бы один раз, то число уже не простое)
if (figure mod i)=0 then
//значит изменяем значение переменной на true
f:=true;
end;

//теперь проверяем: «если не f, то число ПРОСТОЕ»(т.е. если значение не true(а значит //false-какое и было изначально перед поиском делителей),)
if not(f) then
memo1.Text:=’Число ‘+Edit1.Text+’ ПРОСТОЕ!’ else
//в противном случае число СЛОЖНОЕ!
memo1.Text:=’Число ‘+Edit1.Text+’ СЛОЖНОЕ!’;

end;
end;

Теперь напишем обработчик события ONChange компонента TEdit (TForm1.Edit1Change) .

Это будет реализация «Защиты от дурака». Нам ведь не нужно, чтобы какой-нибудь нехороший юзверь ввел какое-нибудь слово вместо числа или цифры, в частности.

Так что приступим к этому простому занятию. Все опять же закомментировано и понятно.

//Проверка правильности ввода данных
//»Защита от дурака»

procedure TForm1.Edit1Change(Sender: TObject);
var CH:Set of Char;//множество символов
s:string;//строка символов
i:byte;
begin
//определяем множество — только числа от 0 до 9
CH:=[‘0’..’9′];
s:=Edit1.Text;
//перебор каждого символа строки
for i:=1 to length(s) do
begin
//если введен символ, которого нет во множестве
if not(s[i] in CH) then
begin
//сообщение об ошибке
messagedlg(‘ВВОДИТЬ МОЖНО ТОЛЬКО ЦИФРЫ!’,mtWarning,[mbok],0);
//очистка поля ввода
Edit1.Clear;
end;
end;
end;

Ну вот, впринципе, все и готово.

Теперь просто добаляем в обработчик события OnClick нашей кнопочки следующее(вызов нашей процедуры):

procedure TForm1.Button1Click(Sender: TObject);
begin
NFigure;
end;

Наша программа готова. Просто сохраним и откомпилим проект(Ctrl+F9).

ИСХОДНИК ПРОГРАММЫ МОЖНО СКАЧАТЬ ЗДЕСЬ >>

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


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


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Проверка числа на простоту
    , выод делителей

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    10.07.08, 11:27

      Приветствую всех, на днях решил занятся изучением делфи, но т.к. я не программист то возникто сразу много вопросов.
      вот например такая задача: в поле едит запрашивается положит число. определить явл оно простым или нет и если число не простое вывести его делители.

      вот что получилось у меня:
      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;

      наведите на путь истинный, как вывести делители числа? буду очень благодарен.


      and85



      Сообщ.
      #2

      ,
      10.07.08, 11:31

        можно попробывать в цикле от 1 до ТвоеЧисло -1 попробывать твое число делить на переменную цикла и если результат деления будет целочисленным, то вот ты и получил уже два делителя


        —Ins—



        Сообщ.
        #3

        ,
        10.07.08, 11:32

          Есть два классических способа решения — поищи в гугле: решето Эратосфена (для простых случаев), тест Рабина-Миллера (для очень больших чисел)


          and85



          Сообщ.
          #4

          ,
          10.07.08, 11:33

            а вообще так сходу не скажу… мож какие математические методы есть:)

            Добавлено 10.07.08, 11:34
            Ins лучше решение сказал:)


            serdemon



            Сообщ.
            #5

            ,
            10.07.08, 11:40

              насколько я понимаю после этого условия
              for i:=1 to n do
              if n mod i =0 then
              в n хранится делитель, или нет?


              —Ins—



              Сообщ.
              #6

              ,
              10.07.08, 11:43

                Цитата serdemon @ 10.07.08, 11:40

                for i:=1 to n do
                if n mod i =0 then
                в n хранится делитель, или нет?

                Ну и зачем тебе делить до n, если можно делить до sqrt(n) + 1? И зачем тебе делить на 4, если можно ограничится только проверкой делимости на 2? Почитай про решето Эратосфена, лениво два слова в гугле набрать? ;)


                and85



                Сообщ.
                #7

                ,
                10.07.08, 11:44

                  делитель хранится в i. а n — это число для которого ты делители ищеш


                  Domino



                  Сообщ.
                  #8

                  ,
                  10.07.08, 11:54

                    Метод рабочий, но не самый быстрый.

                    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 — 10.07.08, 11:54


                    and85



                    Сообщ.
                    #9

                    ,
                    10.07.08, 12:14

                      Ins прав. я приблизительный вариант предложил


                      serdemon



                      Сообщ.
                      #10

                      ,
                      10.07.08, 12:15

                        извините, за мои глупые вопросы…
                        про решето Эратосфена я прочитал, но не особо понял, т.к. там еще и с массивом.
                        ребят вы меня похоже немного не поняли, я хочу используя свой код (он у меня работает) вывести все делители числа (через пробел или запятую, без разницы).
                        можно даже так в поле эдит я ввожу число, мне нужно вывести все его делители

                        Сообщение отредактировано: serdemon — 10.07.08, 12:20


                        and85



                        Сообщ.
                        #11

                        ,
                        10.07.08, 12:21

                          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)+ ‘ — не простое число’;


                          serdemon



                          Сообщ.
                          #12

                          ,
                          10.07.08, 12:30

                            and85 спасибо, только было бы лучше, если б ты просто подсказал как сделать


                            Domino



                            Сообщ.
                            #13

                            ,
                            10.07.08, 12:41

                              А при чем тут простые числа тогда, если тебе делители нужны?
                              Перебираешь от 1 до k (тупо без оптимизации), проверяешь, делится или нет. Если делится, добавляешь в строку. Вот и весь алгоритм.


                              serdemon



                              Сообщ.
                              #14

                              ,
                              10.07.08, 13:06

                                мне нужно было сделать так, определить какое число, если простое то вывести сообщение «число н простое», а если оно не простое то вывести сообщение «число н не простое» и еще одно сообщение где указаны все его делители

                                P.S. спасибо всем за помощь.

                                Profi

                                ttiger



                                Сообщ.
                                #15

                                ,
                                10.07.08, 16:14

                                  Если не умеешь работать с массивами, то вот алгоритм

                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                  0 пользователей:

                                  • Предыдущая тема
                                  • Delphi: Общие вопросы
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0682 ]   [ 16 queries used ]   [ Generated: 24.05.23, 22:40 GMT ]  

                                  Найти простое число

                                  Falk0ner, вс, 06/07/2008 — 15:35.

                                  • Арифметика, системы счисления, комплексные числа

                                  Найти простое число

                                  unit simple_;
                                  interface
                                  uses
                                   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
                                   StdCtrls;
                                  type
                                   TForm1 = class(TForm)
                                    Button1: TButton;
                                    Label1: TLabel;
                                    Edit1: TEdit;
                                    Label2: TLabel;
                                    procedure Button1Click(Sender: TObject);
                                   private
                                    { Private declarations }
                                   public
                                    { Public declarations }
                                   end;
                                  var
                                   Form1: TForm1;
                                  implementation
                                  {$R *.DFM}
                                  procedure TForm1.Button1Click(Sender: TObject);
                                  var
                                   n: integer; // проверяемое число
                                   d: integer; // делитель
                                   r: integer; // остаток от деления n на d
                                  begin
                                   n := StrToInt(Edit1.text);
                                   d := 2; // сначала будем делить на два
                                   repeat
                                    r := n mod d;
                                    if r <> 0 {// n не разделилось нацело на d} then
                                    d := d + 1;
                                   until r = 0; // повторять пока не найдено число на n делится без остатка
                                   label2.caption := Edit1.text;
                                   if d = n then
                                    label2.caption := label2.caption + ‘ — простое число.’
                                   else
                                    label2.caption := label2.caption + ‘ — обычное число.’;
                                  end;
                                  end.

                                  DelphiWorld 6.0

                                  Понравилась статья? Поделить с друзьями:
                                • Радиус окружности 5см как найти диаметр
                                • Как найти работу удачу деньги
                                • Как найти фронтальную проекцию прямой
                                • Отряд скат как найти источник разрядов
                                • Как найти коэффициент использования металла