Как получить ближайшее число, которое делится на делитель в scala - PullRequest
2 голосов
/ 27 января 2020

Как получить ближайшее число, которое делится на делитель в scala.

Например,

-if divisor -20 and dividend is 15, the number 15 has to be converted to 20
-if divisor -20 and dividend is 39, the number 39 has to be converted to 40 
-if divisor -20 and dividend is 45, the number 45 has to be converted to 60 
-if divisor -20 and dividend is 60, the number  conversion is not required.

Я пробовал это. Но это не работает для отрицательных чисел.

def makeNum(num:Double,buc:Int){
if (num % buc == 0) println(num) else
println(  buc * (num/buc).ceil )
}
   makeNum(39,20) --> 40.0 - working
   makeNum(-10,20) --> -0.0 - Not correct

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Похоже, вам не нужно «ближайшее» число, как указано в заголовке, но на самом деле «следующее» число, как в «от нуля». Если это так, то ваш оригинальный дизайн довольно близок. Вам просто нужно учесть знак, как в «направлении от нуля».

def makeNum(num :Double, buc :Int) :Double = {
  val sign = if (num*buc < 0) -1 else 1
  buc*sign * (num/buc*sign).ceil
}

makeNum(39,20)    //res0: Double = 40.0
makeNum(-10,20)   //res1: Double = -20.0
makeNum(45, -20)  //res2: Double = 60.0
makeNum(-7, -3)   //res3: Double = -9.0
3 голосов
/ 27 января 2020

Вы были слишком близко. Но проблема заключалась не в отрицательных числах, а в том, что он всегда искал следующее число, а в шкафах можно было найти предыдущее число.
Кроме того, ваш код не соответствовал общепринятой практике разделения проблемы, ваша функция должна просто вернуть номер, не печатая его.

Вот полный код.

def findClosestDivisible(dividend: Int, divisor: Int): Int =
  if (dividend % divisor == 0) {
    // Return the dividend if it is already divisible.
    dividend
  } else {
    // Find the quotient.
    val quotient = dividend / divisor

    // 1st possible closest number. 
    val n1 = divisor * quotient

    // 2nd possible closest number.
    val n2 =
      if ((dividend * divisor) > 0)
        divisor * (quotient + 1)
      else
        divisor * (quotient - 1)

    // Return the closest number.
    import math.abs
    if (abs(dividend - n1) < abs(dividend - n2)) n1
    else n2
  }

Примечание : код основан на алгоритм на этой странице , я просто ограничил себя, чтобы реализовать его в Scala.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...