Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Mostrar números amigos

Estas en el tema de Mostrar números amigos en el foro de SQL Server en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/12/2012, 17:51
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 11 años, 10 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.
  #2 (permalink)  
Antiguo 11/12/2012, 00:24
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Mostrar números amigos

Primero que nada- ¡a mi me encantan mucho tales desafios!

El problema es que en el procedimiento comparás entre cada número y su suma de dividores (lo que sirve para encontrar números perfectos), pero no entre números y las sumas de los demás.

Yo intentaría así: inserta a la tabla todos los números y sus sumas de dividores (sin la condición if @amigo=@i),
y después busca los amigos:
Código SQL:
Ver original
  1. SELECT *
  2. FROM NumAmigos A1
  3. INNER JOIN NumAmigos A2
  4.     ON A1.Numero>A2.Numero
  5.     AND A1.Numero=A2.Amigo
  6.     AND A1.Amigo=A2.Numero;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog

Etiquetas: select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:22.