Hola a todos.
Llevo todo el día tratando de realizar un ejercicio que se compone de una función, que recibe un número como parámetro y muestra la suma de los divisores de dicho número:
Código:
GO
IF EXISTS (select name from sysobjects where name ='SumaDivisores' and type='FN')
DROP FUNCTION SumaDivisores
GO
GO
IF EXISTS (select name from sysobjects where name ='SumaDivisores' and type='FN')
DROP FUNCTION SumaDivisores
GO
CREATE FUNCTION SumaDivisores(@num bigint)
returns bigint
as
begin
declare @contador bigint;
declare @numero bigint;
declare @numero2 bigint;
declare @i bigint;
set @contador = 0
set @i = @num
set @numero = @num
while @i>=2
begin
set @i = @i - 1
set @numero2=@numero%@i
if @numero2 = 0
begin
set @contador= @contador + @i
end
end
return @contador;
end
Sé de antemano que los números 220 y 284 son número amigos y la funciona correctamente, si introduzco 220 me dice que la suma de sus divisores es 284. Hasta aquí todo correcto.
Ahora creo un procedimiento que, en teoría, debe mostrar los número amigos en una tabla:
Código:
GO
IF EXISTS(select name from sysobjects where name='numerosAmigos' and type='P')
DROP PROCEDURE numerosAmigos
GO
CREATE procedure numerosAmigos
@maximo bigint
as
BEGIN
drop table numamigos;
CREATE TABLE numamigos (
[numOrden] [bigint] IDENTITY (1, 1) NOT NULL ,
[numero] [bigint] NULL ,
[amigo] [bigint] NULL ,
CONSTRAINT [PK_numamigos] PRIMARY KEY CLUSTERED
(
[numOrden]
) ON [PRIMARY])
declare @i bigint
declare @amigo bigint
set @i=1;
while @i < @maximo
BEGIN
set @amigo=dbo.SumaDivisores(@i);
if @amigo=@i
BEGIN
INSERT INTO dbo.numamigos(numero,amigo) VALUES (@i,@amigo);
end
set @i=@i + 1;
end
SELECT numero,amigo FROM dbo.numamigos;
end
Pero falla, me devuelve los números perfectos, pero no los número amigos. Si le paso como parámetro el número 1000 sólo debe mostrar los números 220 y 284. Si alguien pudiera ayudarme lo agradecería muchísimo.
Un saludo.