Ver Mensaje Individual
  #18  
Antiguo 05-03-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 11
aguml Va por buen camino
Lo he solucionado aunque creo que lo hago de una forma algo diferente a lo que explicas (o eso creo jejeje). Pongo el codigo a ver que os parece:
Código PHP:
#include <stdio.h>
#include <stdlib.h>

int MCD(int aint b);
int ObtenerNumeroDeDivisores(int valor);
void ObtenerListaDivisores(int valorintDivisores);
int ObtenerPareja(int dividendointDivisoresint nDivisoresintvalor1intvalor2int pos);
void shuffle(intDivisoresint nDivisores);

int main()
{
   
int inzmultiplicandomultiplicadordivisorComunnDivisores;
   
int *Divisores;
   
int Resultado[10]={0};
   
int repetidoretval=0posibles=0;
   
int salir;
   
char caracter;

   
//Inicializo la semilla para rand()
   
srand (time(NULL));

   do{
      
//Pido el valor del pico de la piramide
      
printf("Introduce el valor de la cima de la piramide: ");
      
scanf("%d",&Resultado[0]);
      
printf("\n---------------------------------\n");

      
nDivisores ObtenerNumeroDeDivisores(Resultado[0]);

      
Divisores = (int*)malloc(sizeof(int) * nDivisores);

      
//Obtengo todos los divisores del valor del pico de la piramide
      
ObtenerListaDivisores(Resultado[0], Divisores);

      
//Barajo la lista de divisores
      
shuffle(Divisores,nDivisores);

      
retval=0;

      
//Con este bucle puedo calcular todas las posibilidades del segundo nivel de la pirámide
      
for(z=0;z<nDivisores;z++)
      {
         
//Obtengo los dos valores del segundo nivel
         
retval ObtenerPareja(Resultado[0], DivisoresnDivisores, &multiplicando, &multiplicadorz);

         
//Si no hubo error entramos
         
if(retval != -1){
            
//Coloco los dos valores del segundo nivel en el array del resultado
            
Resultado[1]=multiplicando;
            
Resultado[2]=multiplicador;

            
//Calculo el valor central del tercer nivel
            
divisorComun MCD(multiplicando,multiplicador);

            
//Calculo los dos extremos del tercer nivel para este MCD
            
if(multiplicando divisorComun)
               
multiplicandodivisorComun/multiplicando;
            else
               
multiplicandomultiplicando/divisorComun;

            if(
multiplicador divisorComun)
               
multiplicador divisorComun/multiplicador;
            else
               
multiplicadormultiplicador/divisorComun;

            
//Coloco los tres valores del tercer nivel en el array del resultado.
            //El MCD va en el centro
            
Resultado[3]=multiplicando;
            
Resultado[4]=divisorComun;
            
Resultado[5]=multiplicador;

            
multiplicador divisorComun;
            
divisorComun MCD(multiplicandomultiplicador);

            
//Calculo los dos extremos del tercer nivel para este MCD
            
if(multiplicando divisorComun)
               
multiplicandodivisorComun/multiplicando;
            else
               
multiplicandomultiplicando/divisorComun;

            if(
multiplicador divisorComun)
               
multiplicador divisorComun/multiplicador;
            else
               
multiplicadormultiplicador/divisorComun;

            
Resultado[6]=multiplicando;
            
Resultado[7]=divisorComun;
            
Resultado[8]=multiplicador;

            if(
Resultado[8] <= Resultado[5] && Resultado[5] % Resultado[8] == 0)
            {
               
Resultado[9]=Resultado[5] / Resultado[8];

               
//Incremento el contador de posibles soluciones
               
posibles++;

               
//Muestro la pirámide
               
printf("         %i\n"Resultado[0]);
               
printf("      %i     %i\n"Resultado[1], Resultado[2]);
               
printf("   %i     %i     %i\n"Resultado[3], Resultado[4], Resultado[5]);
               
printf("%i     %i     %i     %i\n"Resultado[6], Resultado[7], Resultado[8], Resultado[9]); //Me falta calcular esta fila
               
printf("\n---------------------------------\n");
            }
         }
      }

      if(
nDivisores == 2)
         
printf("\nEl valor introducido es primo. Solo se pueden obtener 2 posibilidades.\n");
      else
         
printf("\nSe obtuvieron %i posibles soluciones.\n",posibles);

      
//Libero la memoria reservada para almacenar los divisores para el segundo nivel
      
if(Divisores != NULL)
         
free(Divisores);

      
//Pido que el usuario decida si repetir o salir
      
do{
         
fflush(stdin);
         
printf("\nPresiona 'S' para salir o 'R' para repetir: ");
         
caracter getchar();
      }while(
caracter != 'S' && caracter != 's' && caracter != 'R' && caracter != 'r');

      if(
caracter == 'S' || caracter == 's')
         
salir 1;
      else
         
system("CLS");
   }while(
salir != 1);

   return 
0;
}
//---------------------------------------------------------------------------

//Máximo común divisor de dos números mediante el algoritmo de Euclides.
int MCD(int aint b)
{
   
int auxcr;

   if(
b){
      
aux=b;
      
b=a;
      
a=aux;
   }

   
r=a%b;
   while(
r>0)
   {
      if(
a>b){
         
a=b;
         
b=r;
         
r=a%b;
      }else{
         
b=0;
         break;
      }
   }
   return 
b;
}
//---------------------------------------------------------------------------

//Retorna el numero de divisores posibles
int ObtenerNumeroDeDivisores(int valor)
{
   
int inDivisores=0;

   for(
i=1;i<=valor;i++)
      if(
valor%i==0){
         
nDivisores++;
      }
   return 
nDivisores;
}
//---------------------------------------------------------------------------

//Rellena el array con divisores posibles
void ObtenerListaDivisores(int valorintDivisores)
{
   
int ij=0;

   for(
i=1;i<=valor;i++)
      if(
valor%i==0){
         *(
Divisores+j)=i;
         
j++;
      }
}
//---------------------------------------------------------------------------

//Funcion que obtiene la pareja de numeros para un MCD
int ObtenerPareja(int dividendointDivisoresint nDivisoresintvalor1intvalor2int pos)
{
   
int divisorComun=0;
   
int n,z;

   if(
nDivisores>0){
      *
valor1 = *(Divisores+pos);
      *
valor2 = (dividendo / *valor1);
      
divisorComun MCD(*valor1, *valor2);
   }else{
      
divisorComun=-1;
   }
   return 
divisorComun;
}
//---------------------------------------------------------------------------

//Funcion para barajar el array de los divisores
void shuffle(int *Divisoresint nDivisores)
{
   
int ijt;

   if (
nDivisores 1)
   {
      for (
0nDivisoresi++)
      {
         
rand() % (nDivisores-1);
         
= *(Divisores+i);
         *(
Divisores+i) = *(Divisores+j);
         *(
Divisores+j) = t;
      }
   }
}
//--------------------------------------------------------------------------- 
Responder Con Cita