es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Divide un número en n partes desiguales.

Tengo un número N, por ejemplo, 100, y quiero dividirlo en n partes (por ejemplo, 10 partes).

Hacer esto de forma lineal es trivial: N/n y obtengo 10 partes cada una con el valor 10.

Sin embargo, me gustaría hacer esto de manera que las partes sean desiguales y aumenten de forma exponencial. Por ejemplo:

10, 30, 60 para que el total sea 100.

¿Cómo puedo escribir esto como una función de JavaScript?

function returnParts(totalDeseado, numPartes) {
    ...
    return partes ///devuelve un array de partes
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr este aumento exponencial en las partes es utilizar una escala logarítmica. Podemos calcular el valor base para cada parte tomando el logaritmo del total deseado, dividiéndolo por el número de partes menos 1, y luego elevándolo a una potencia exponencial. Así es como se vería la función:

    function returnParts(totalDeseado, numPartes) {
      const base = Math.exp(Math.log(totalDeseado) / (numPartes - 1)); // calcular valor base
      let totalActual = 0;
      const partes = [];
    
      for (let i = 0; i < numPartes - 1; i++) {
        const parte = Math.round(base ** i); // calcular valor de la parte actual
        partes.push(parte);
        totalActual += parte;
      }
    
      partes.push(totalDeseado - totalActual); // agregar el valor restante a la última parte
      return partes;
    }
    

    Probemos esta función con el ejemplo de dividir 100 en 3 partes:

    console.log(returnParts(100, 3)); // [10, 31, 59]
    

    Como era de esperar, las partes son desiguales y aumentan de forma exponencial, con un valor total de 100.

Comments are closed.