Mi aplicación demora mucho

Buenas, "Dado un valor M hallar todos los naturales tales cuya suma de dígitos sea M", esa es mi pregunta, lo he desarrollado con Free Pascal, es obligatorio usar como variable el máximo que puede almacenar el pascal para los naturales(Longint, en free pascal es Longword), ya lo hice pero se tarda en buscar todos lo números he imprimirlo, creo que es normal, pero a ver si alguien puede mejorarlo; ahí va mi código:
uses crt;
const
maximo=2147483647; {Maximo valor de la variable longword}
var
m,inicio,cifra,numero,suma,factor,auxiliar:longword;
begin
clrscr;
writeln('Los numeros cuya suma de d¡gitos es: ');
readln(m);
--------------------------------------
{busco el valor mas cercano o igual al primer numero cuya suma es m}
for cifra:=1 to (m div 9) do
inicio:=inicio*10+1;
inicio:=9*inicio;
--------------------------------------
{comienzo a analizar cada numero a ver si se cumple lo preguntado}
for numero:=inicio to maximo do
begin
auxiliar:=numero;
suma:=0;
factor:=10;
{Aquí se sacara cifra por cifra el numero de turno y se sumaran para verificar luego si cumple}
while (suma<=m) and (not (auxiliar=0)) do
begin
suma:=suma+ (auxiliar mod factor);
auxiliar:=auxiliar div factor;
end;
if suma=m then writeln(numero);
end;
end.

1 Respuesta

Respuesta
1
Lo que se me ocurre es que en vez de hacerlo en forma iterativa, que es como veo que lo haces, lo hagas en forma recursiva, definiendo una función que calcule en cada momento la suma de los dígitos del número correspondiente. Mi solución es como sigue:
Uses CRT;
const
max = 2147483647;
Function Sumacifras (N : LongInt) : Integer;
var
aux : Integer;
Begin
if n<10 then
sumacifras:=n
else
Begin
aux:=n mod 10;
sumacifras:= aux+sumacifras(n div 10)
end;
End;
Var
N,i : LongInt;
CIFRA, INICIO, Aux,Aux2 : Integer;
Begin
Clrscr;
Writeln('Introduzca un n£mero: ');
Readln(N);
for i := n to max do
begin
aux2:=sumacifras(i);
if aux2=n then
writeln(i);
end;
readln;
End.
Aquí podrías utilizar la parte de tu programa que utilizas para calcular el número por el que deberías empezar, en lugar de empezar por n, como hago yo.

Añade tu respuesta

Haz clic para o
El autor de la pregunta ya no la sigue por lo que es posible que no reciba tu respuesta.

Más respuestas relacionadas