github.com/pavlo67/common@v0.5.3/common/mathlib/numbers.go (about)

     1  package mathlib
     2  
     3  import (
     4  	"math"
     5  )
     6  
     7  func Divide(total int, minPart, maxPart, minLastRatio float64) (num, part, partLast int) {
     8  	minNum, maxNum := float64(total)/maxPart, float64(total)/minPart
     9  	minNumInt, maxNumInt := int(math.Floor(minNum)), int(math.Floor(maxNum))
    10  	if minNumInt > maxNumInt {
    11  		// TODO??? signal the anomaly
    12  		minNumInt, maxNumInt = maxNumInt, minNumInt
    13  	}
    14  
    15  	//log.Print(minNum, maxNum, minNumInt, maxNumInt)
    16  
    17  	minRest, maxRest := total, 0
    18  	var minRestNum, maxRestNum int
    19  	for k := minNumInt; k <= maxNumInt; k++ {
    20  		rest := total % k
    21  		if rest == 0 {
    22  			part := total / k
    23  			return k, part, part
    24  		}
    25  		if rest < minRest {
    26  			minRest = rest
    27  			minRestNum = k
    28  		}
    29  		if rest > maxRest {
    30  			maxRest = rest
    31  			maxRestNum = k
    32  		}
    33  	}
    34  
    35  	part = total / maxRestNum
    36  
    37  	// log.Print(maxRestNum, maxRest, float64(maxRest)/float64(part))
    38  	if lastRatio := float64(maxRest) / float64(part); lastRatio >= minLastRatio {
    39  		return maxRestNum + 1, part, maxRest
    40  	}
    41  
    42  	part = total / minRestNum
    43  	return minRestNum, part, part + minRest
    44  }