Pascal/Turbo Pascal - Buscador de numeros perfecto, deficientes o abundantes situados entre 4 y n numeros

 
Vista:

Buscador de numeros perfecto, deficientes o abundantes situados entre 4 y n numeros

Publicado por Marco Castro (1 intervención) el 16/05/2020 17:38:09
Elaborar un Algoritmo en seudocódigo y un programa en Pascal, que muestre todos los números Perfectos, Deficientes o Abundantes comprendidos desde el número 4 hasta un número entero N dado por el usuario mayor que el número 4, Validar esta condición, mostrando el mensaje de ERROR correspondiente en el caso de que el número no cumpla esta condición y solicitando nuevamente el número hasta un máximo de 3 oportunidades en cuyo caso indicar el mensaje Problema Bloqueado y terminar el Algoritmo o Programa. En caso de que el número este correcto indicar para cada número de la secuencia si este es Perfectos, Deficientes o Abundantes.

Se dice que un número es Perfecto si la suma de todos sus divisores (sin incluirlo a él) da como resultado dicho número. En cambio, si la suma es inferior se dice que el número es Deficiente y si la suma es superior se dice que el Número es Abundante. Ejemplos:

6 es un número Perfecto, ya que los divisores de 6 sin incluirlo a él, son 1, 2, 3, y 1+2+3 = 6.
8 tiene como divisores sin incluirlo a él 1, 2, 4 y suma es 7, por lo tanto es Deficiente.
24 tiene como divisores si incluirlo a él 1,2,3,4,6,8,12 y su suma es 36, por lo tanto es Abundante
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 112
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Buscador de numeros perfecto, deficientes o abundantes situados entre 4 y n numeros

Publicado por juanba (40 intervenciones) el 24/05/2020 14:13:23
Ahí va una posible solución. He limitado los números al rango 4..1000 porque a medida que se usan números más grandes el número de operaciones sube en proporción geométrica. De todos modos si se quiere probar el límite de 10000 para encontrar el siguiente perfecto que es 8128 va bastante rápido, Aunque en este caso yo quitaría los dos writeln que muestran los números abundantes y deficientes y dejaria solo los perfectos.

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//------------------------------------------------------------------------------
// NumPerfecto
// Este programa obtiene los números perfectos, abundantes y deficientes desde
// el 4 hasta un limite maximo introducido por el usuario.
//------------------------------------------------------------------------------
Program NumPerfecto;
const Maximo = 1000;
      MaxErrores = 3;
var n, Numero, NumError: Word;
 
//------------------------------------------------------------------------------
// SumaDeDiv
// Calcula la suma de los divisores de un número, o sea aquellos que dan resto
// cero al efectuar la división. La comprobación solo se hace hasta la mitad del
// número porque dividirlo por un valor que es más de la mitad nunca puede dar
// una división exacta.
//------------------------------------------------------------------------------
Function SumaDeDiv(Num: Word): Word;
var n, MaxDiv: Word;
Begin
  Result := 0;
  MaxDiv := Num div 2;
  for n := MaxDiv downto 1 do
    if Num mod n = 0 then
      Inc(Result, n);
End;
 
//------------------------------------------------------------------------------
// Comparar
// Compara el número con la suma de sus divisores y emite un texto según el
// resultado de la comparación.
//------------------------------------------------------------------------------
Procedure Comparar(Num: Word);
var NumDiv: Word;
Begin
  if (Num >= 4) and (Num <= Numero) then
  Begin
    NumDiv := SumaDeDiv(Num);
 
    if NumDiv < Num then
      writeln('El numero ', Num, ' es Deficiente.')
    else if NumDiv > Num then
      writeln('El numero ', Num, ' es Abundante.')
    else if NumDiv = Num then                                        // Esta comprobación no es necesaria
      writeln('El numero ', Num, ' es ----------->PERFECTO.')
  End;
End;
 
//------------------------------------------------------------------------------
// Programa principal
// Solicita el número hasta el cual se va a realizar el cálculo. Si se introduce
// tres veces seguidas un límite erróneo, tira la toalla.
//------------------------------------------------------------------------------
Begin
  NumError := MaxErrores;
  writeln('Introduzca un numero entre 4 y 1000');
  Repeat
    readln(Numero);
    if (Numero < 4) or (Numero > Maximo) then
    Begin
      writeln('Numero introducido fuera del rango 4..1000. Pruebe otra vez.');
      Dec(NumError);
    End Else
      break;
  Until NumError < 1;
  if NumError = 0 then
    writeln('Programa BLOQUEADO por usuario TORPE')
  else
    for n := Numero downto 1 do
      Comparar(n);
  writeln('Pulse Intro si quiere.');
  readln;
End.

Y creo que funciona ... ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar