-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnumero_perfecto.rb
71 lines (63 loc) · 1.45 KB
/
numero_perfecto.rb
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
# encoding: UTF-8
class Numero
attr_accessor :numero
def initialize(numero)
@valor = numero
end
def esPerfecto?
if @valor == sumaDivisoresSinNumero
return true
else
return false
end
end
def obtieneDivisores
@divisores = []
divisor = @valor
until divisor == 0
residuo = @valor % divisor
cociente = @valor / divisor
if residuo == 0
@divisores.push cociente
divisor = @valor / (cociente+1)
else
divisor = divisor - 1
end
end
end
def muestraDivisores
cadena = ""
@divisores.each do |value|
cadena = cadena + value.to_s + " "
end
return cadena
end
def sumaDivisoresSinNumero
suma = 0
obtieneDivisores
@divisores.each do |value|
if @valor != value
suma = suma + value
end
end
return suma
end
end
puts 'Por favor ingresa un número que deseas verificar si es perfecto'
cadena = gets.chomp.downcase
if /\D/ =~ cadena
puts 'Por favor ingresar un número entero'
else
respuesta = cadena.to_i
noEncontrado = true
while noEncontrado
numero = Numero.new(respuesta)
if numero.esPerfecto?
puts "El número perfecto más cercano es: " + respuesta.to_s
puts "Sus divisores son: " + numero.muestraDivisores
noEncontrado = false
else
respuesta = respuesta - 1
end
end
end