Как проверить простое число в Delphi

delphi primes

4059 просмотра

2 ответа

27 Репутация автора

Я хочу прочитать все простые числа от 1 до 10000 в динамический массив и все не простые числа в другой динамический массив, а затем прочитать простой массив в richedit1до сих пор у меня есть:

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;

но это не похоже на работу. Он помещает все целые числа в anotprime.

Автор: theunie Источник Размещён: 12.11.2014 08:13

Ответы (2)


5 плюса

538056 Репутация автора

Возможно, основная проблема, с которой вы столкнулись, заключается в том, что вы объединяете все различные аспекты (циклический просмотр кандидатов, первичная проверка, отображение и т. Д.) В одну функцию.

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

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
    if N mod M = 0 then
    begin
      Result := False;
      exit;
    end;
  end;
  Result := True;
end;

Теперь вы можете составить список, содержащий простые числа:

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

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

Автор: David Heffernan Размещён: 12.11.2014 10:17

-1 плюса

14 Репутация автора

Решение

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;

Автор: user6790494 Размещён: 31.05.2017 03:14
Вопросы из категории :
32x32