Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/12/2012, 17:51
El_LoBooo
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 6 meses
Puntos: 0
Mostrar números amigos

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.