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 }