Pascal/Turbo Pascal - ayudenme con este ejercicio de numeros deficientes y odiosos

 
Vista:
sin imagen de perfil
Val: 6
Ha aumentado su posición en 46 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

ayudenme con este ejercicio de numeros deficientes y odiosos

Publicado por Andres Chavarri (15 intervenciones) el 09/06/2021 15:15:10
Dado una secuencia de números naturales (mayores que cero) y finalizada al introducir un número negativo, construya un algoritmo que determine el promedio de los números deficiente y a su vez odioso del total de números de la secuencia introducida., según la definiciones dadas a continuación :
Número deficiente: todo número natural que cumple que la suma de sus divisores propios es menor que el propio número. Por ejemplo, 16 es un número deficiente ya que sus divisores propios son 1, 2, 4 y 8 y se cumple que 1+2+4+8=15, que es menor que 16.
Número odioso: todo número cuya expresión en base 2 (binaria) contiene un número impar de unos. Por ejemplo, 11=1011 es un número odioso porque en binario tiene tres unos, mientras que 15 = 1111 no es odioso porque contiene cuatro(4) unos en su representación binaria.
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

ayudenme con este ejercicio de numeros deficientes y odiosos

Publicado por ramon (2158 intervenciones) el 11/06/2021 19:09:40
Mira si esto te encamina,

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
program numer;
 uses
    crt;
  type
     string4 = string[4];
     binarios = string[16];
 
  const
      max = 15;
 
   var
     numeros : array[0..max] of integer;
     i, t : integer;
     odi : integer;
 
   procedure entradanumeros;
   var
     nu : integer;
   begin
      i := 1;
      writeln(' Entre Numeros Naturales Max [',max,']','  Termina -0');
     repeat
         write('Entre N§',i,' = ');
         readln(nu);
         if nu > 0 then
         begin
           numeros[i] := nu;
           i := i + 1;
         end;
     until (i > max) or (nu <= 0);
     if i > max then
     i := i - 1;
     numeros[0] := i - 1;
   end;
 
   procedure deficiente(nm : integer);
   var
     divisores : array[1..20] of integer;
     elnu, cont : integer;
     va : real;
   begin
      cont := 1;
      i := 1;
      fillchar(divisores,20,0);
    repeat
      va := nm / i;
      if frac(va) = 0 then
      begin
      divisores[cont] := i;
      inc(cont);
      end;
      i := i + 1;
    until i > nm;
     elnu := 0;
     for i := 1 to cont - 2 do
     begin
     write(' ',divisores[i]);
     elnu := elnu + divisores[i];
     end;
     write(' = ');
     if elnu < nm then
     writeln(elnu,' < ',nm,' =  Deficiente');
   end;
 
   procedure odiosos(d : integer);
   var
     resu, decim : real;
     entero : integer;
     binario, bina : binarios;
     tom, g, nn : integer;
   begin
     entero := d;
     nn := 1;
    repeat
       resu := entero / 2;
       decim := frac(resu);
       if decim > 0 then
       begin
         bina[nn] := '1';
         bina[0] := chr(nn);
         nn := nn + 1;
       end
    else
       begin
         bina[nn] := '0';
         bina[0] := chr(nn);
         nn := nn + 1;
       end;
       entero := trunc(resu);
    until entero <= 0;
      g := 1;
      for nn := length(bina) downto 1 do
      begin
        binario[g] := bina[nn];
        binario[0] := chr(g);
        g := g + 1;
      end;
       for nn := 1 to length(binario) do
       if binario[nn] = '1' then
       tom := tom + 1;
       if tom mod 2 = 0 then
       odi := odi + 1;
   end;
 
 
 
 
  begin
     clrscr;
     odi := 0;
     entradanumeros;
     for t := 1 to numeros[0] do
     deficiente(numeros[t]);
     writeln('  ');
     for t := 1 to numeros[0] do
     odiosos(numeros[t]);
     writeln(' Promedio = ',(numeros[0] / odi):0:2);
     readkey;
  end.
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
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

Versión más breve para la función Odioso()

Publicado por juanba (40 intervenciones) el 14/06/2021 17:31:41
Hola.
Quiero proponer una solución más breve para la función Odioso. Utiliza una función auxiliar que calcula el número de dígitos binarios a 1 (de un número natural o sea Integer).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function NumUnos(Numero: Integer): Integer;
begin
  NumUnos := 0;
  while Numero <> 0 do
  begin
    if (Numero and 1) = 1 then
      NumUnos := NumUnos + 1;          // O también Inc(NumUnos);
    Numero := Numero Shr 1;
  End;
end;
 
function Odioso(Numero: Integer): Boolean;
begin
  Odioso := (NumUnos(Numero) mod 2) = 1;
end;
Suerte
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