PDA

Ver la Versión Completa : Suma de dígitos primos - Simplificar código


Subliminalz
11-06-2013, 05:41:08
Hola, como están, espero que muy bien y con ánimos de ayudar, tengo un pequeño código que suma los dígitos primos de cualquier combinación de números que el usuario teclee, quisiera saber ¿cómo simplifico el código?, los dígitos van del 1 al 9.

-Si el usuario teclea: 245896, entonces los primos son: 2 y 5, y la suma de estos 2 primos es: 7...
-Si el usuario teclea: 221479, entonces los primos son: 2, 2, 7 y la suma de estos 3 primos es: 11...

No sé qué hacer con esas excepciones que he puesto allí, en total 4, donde "r (residuo)" tiene que ser distinto de: 1, 4, 6 y 9... ¿Qué puedo hacer para simplificar esta operación?, pensé en hacerlo con la fórmula de series, pero se complica más, al menos para mí... trate de hacerlo de otra manera pero se me queda el 2, ya que es par...


procedure TForm1.Button1Click(Sender: TObject);
var r,x,s:integer;
begin
x:=StrToInt(Edit1.Text);
s:=0;
repeat
r:=x mod 10;
x:=x div 10;
if r<>1 then
if r<>4 then
if r<>6 then
if r<>9 then
if r div 2<=3 then
s:=r+s;
until x=0;
Edit1.Text:=IntToStr(s);
end;


Proyecto hecho en Delphi XE3, muchas gracias por su ayuda... y consejos que me puedan brindar...

WkaymQ48
11-06-2013, 09:04:51
Que tal así:

function Suma(Str: String): Integer;
var
i: Integer;
begin
Result:= 0;
for i:= 1 to Length(Str) do
if Str[i] in ['1','2','3','5','7'] then
Result:= Result + StrToInt(Str[i]);
end;

// Por ejemplo
Edit1.Text:= IntToStr(Suma(Edit1.Text));

Subliminalz
11-06-2013, 23:32:07
Si amigo, creo que la mejor opcion era ponerle los numeros primos y que me ignore todos los demas, jeje... esta genial el codigo, le puse un begin al Edit1 y ya me funciona, muchas gracias WkaymQ48...

ecfisa
12-06-2013, 00:00:22
Hola Subliminalz.

Sólo como agregado, si quisieras obtener la suma a partir de un valor numérico:

function SumarDigitosPrimos(Numero: Integer): Integer;
var
i, Digito: Integer;
begin
Result := 0;
while Numero > 0 do
begin
Digito := Numero mod 10;
if Digito in [1,2,3,5,7] then
Inc(Result, Digito);
Numero := Numero div 10;
end;
end;

// llamada
...
begin
ShowMessage(IntToStr(SumarDigitosPrimos(12357)));
end;


Saludos. :)