Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Verificar si un número es primo (https://www.clubdelphi.com/foros/showthread.php?t=88037)

agustin_uni 07-04-2015 00:18:36

Verificar si un número es primo
 
Hola que tal, soy estudiante de ingeniería, y es mi primer año de principios de computadoras. Es mi primera experiencia programando, así que me esta costando considerablemente, pero espero que con un poco de esfuerzo se pueda mejorar jaja.
Mi primera pregunta en el foro es un ejercicio que me pide que cree un programa en donde me muestre si un numero es primo o no, ya estuve leyendo varias publicaciones e intente hacer el programa pero con algunos errores.
Código Delphi [-]
var
a,i:integer;
begin
a:=strtoint(edit1.Text);
for i:=2 to a-1 do
if a mod i =0 then
begin
edit2.text:='no es primo'
end
else
edit2.text:='es primo'

end;
De esta manera creo que el error, es que al tener un for, el programa me va a evaluar al numero con cada división desde i:=2 a a-1. Osea que en la mayoría de los números, el resultado va a ser primo pero a la vez no primo.. de que otra manera lo podria restringir esto? lo pense de esta manera porque no me di cuenta que el programa lo iba a evaluar en varias divisiones, sepan entender jaja.
Perdon por las molestias, sldos.

jhonny 07-04-2015 00:33:53

La verdad no he reparado el algoritmo, pero parece que por acá lo han resuelto:

http://www.clubdelphi.com/foros/show...0&postcount=14

nlsgarcia 07-04-2015 04:58:34

agustin_uni,

¡Bienvenido al Club Delphi! :D

Te sugiero revisar la Guía de estilo de los foros, recomendada a todos los nuevos ingresos al Club Delphi.

¡Gracias por tu cooperación! :) ^\||/

Saludos,

Nelson.

nlsgarcia 07-04-2015 05:13:04

agustin_uni,

Cita:

Empezado por agustin_uni
...Mi primera pregunta en el foro es un ejercicio que me pide que cree un programa en donde me muestre si un numero es primo o no...

:rolleyes:

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Verifica si un número es primo ó compuesto
function CheckPrime(Number : LongWord) : Boolean;
var
   NumberSqrt, i : Integer;

begin

   Result := True;

   NumberSqrt := Trunc(Sqrt(Number));

   for i := 2 to NumberSqrt do
   begin
      if (Number mod i) = 0 then
      begin
         Result := False;
         Exit;
      end;
   end;

end;

// Permite solo entrada de datos númericos
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if not (Key  in ['0'..'9',#8]) then
      Key := #0;
end;

// Valida el rango de un número y verifica si es primo ó compuesto
procedure TForm1.Button1Click(Sender: TObject);
var
   Number : LongWord;

begin

   if (StrToInt64(Edit1.Text) >  High(LongWord)) then
   begin
      MessageDlg('El Número Máximo Permitido para Chequeo de Primo es : ' + IntToStr(High(LongWord)),mtInformation,[mbOk],0);
      Exit;
   end;

   Number := StrToInt64(Edit1.Text);

   if CheckPrime(Number) then
      MessageDlg('El número ' + IntToStr(Number) + ' es Primo',mtInformation,[mbOk],0)
   else
      MessageDlg('El número ' + IntToStr(Number) + ' es Compuesto',mtInformation,[mbOk],0);

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Verifica si un número es Primo o Compuesto.

Revisa esta información relacionada:
Espero sea útil :)

Nelson.

engranaje 07-04-2015 10:26:52

Si entendí bien tu problema, te sucede que en algunos caso vas a obtener un
monton de mensajes 'no es primo', 'es primo'. Quedando en el edit 2 al final solo
el resultado obtenido al dividir un número justo por su anterior. O sea que nunca sera primo,
fijate lo que pasa si introduces un 2 o el 1 en el edit1 en tu algoritmo.
Lo normal en estos casos sería tener una variable booleana que comenzara a true y se
pusiera a false en el momento de encontrar un caso que elimine la posibilidad de
que sea primo, rompiendo el bucle en ese momento.

Un sencillo ejemplo modificando tu código sería asi
Código Delphi [-]
var   a,i:integer;
  bEsPrimo: boolean;
begin
  bEsPrimo := True; 
  a:=strtoint(edit1.Text);
 
  for i:=2 to a-1 do    
    if a mod i =0  then 
    begin
      bEsPrimo := False;
      break;
    end;
  
  if bEsPrimo    
    edit2.text:='es primo'  
  else  
    edit2.text:='no es primo';  
end;

Otra posiblidad podría ser esta:
Código Delphi [-]
var   a,i:integer;
  resultado: string;
begin
  resultado := 'no es primo'; 
 
  a:=strtoint(edit1.Text);
 
  for i:=2 to a-1 do     if a mod i =0  then 
    begin
      resultado := 'es primo';       
      break;
    end;

  edit2.text:= resultado;  
end;

agustin_uni 07-04-2015 15:17:08

Perfecto! con el boolean puedo solucionar el problema, al programa le doy la condicion de que si sale un a mod i =0 directamente que se haga false, muchas gracias!


La franja horaria es GMT +2. Ahora son las 16:32:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi